# Zugriff auf externe .class Dateien (und resourcen) aus JAR



## oliver1974 (17. Aug 2007)

Mal folgende Frage:

Gesetzt die class-Datei der Anwendung befindet sich in einem JAR.

Nun habe ich Resourcen, die ich BEWUSST nicht innerhalb desselben Jars haben
will, sondern "normal", also ungepackt im selben Verzeichnis wie das Jar.

(Verzeichnis) dist -> Anwendung.jar
                          -> de/resources/language.properties

Ich hoffe, das ist halbwegs verständlich..

Nun würde ich gerne mit 
ResourceBundle.getBundle("de/resources/language")

mir die Resource holen (in dem Fall eine Properties Datei für eine Sprachvariante)
aber ich bekomm keinen Zugriff drauf.

Das gleiche passiert mir mit Klassen, die nicht innerhalb des Jars liegen...

Ich würde mal ganz stumpf sagen, dass irgendwie der Classpath nicht
korrekt ist.. obwohl ich den (hoffentlich?) korrekt beim Java-Aufruf
übergebe.. oder wird der gnadenlos vom im Manifest des Jars definierten
Classpath übergebügelt?

Oder geht das eventuell gar nicht so, wie ich mir das denke?


----------



## Wildcard (17. Aug 2007)

Der Classpath im Manifest ist der entscheidende.


----------



## oliver1974 (17. Aug 2007)

Hmm, auf den Trichter war ich auch schon gekommen...

Dabei stieß ich allerdings auf ein Problem, dass aber wohl nicht mehr  hierher gehört:

Die Manifest - Datei unter Netbeans wird ja anhand der Projekt-Definition erstellt... kurioserweise wird dort, sobald ich zusätzlich zu den benötigten externen Jars (von denen ich auch welche brauche) ein Verzeichnis angebe, kein lib-Unterordner (der die externen Jars enthalten würde) mehr im dist-Ordner erstellt...

Seltsam, aber ich glaube das gehört ins Netbeans-Forum.

Ich werde erstmal mit einer manuell manipulierten Manifest-Datei experimentieren..


----------



## oliver1974 (22. Aug 2007)

Ich muss das Thema mal wieder nach oben holen..

Ich bastele immer noch daran rum... Was ich mich ernsthaft frage.. Geht das überhaupt?
Ich meine auf eine Klasse oder ein ResourceBundle über den Klassen-Loader zuzugreifen,
wenn die Zieldatei NICHT im Jar ist??

Ich habe langsam meine Zweifel.

Ich kann problemlos Dateien öffnen und auslesen.. kein Problem.. aber etwas via Klassen-Loader
zu Laden, was NICHT innerhalb des JARs ist, will mir nicht gelingen, trotz korrektem classpath
eintrag in der MANIFEST Datei im JAR und korrektem Pfad (vermutlich korrektem Pfad..)

Soll ich mal Beispielcode hochladen?


----------



## sparrow (22. Aug 2007)

Welcher Classpath steht denn in der manifest?


----------



## Tom299 (22. Aug 2007)

das gleiche problem hab ich auch gerade:



```
package de.test;

import java.util.ResourceBundle;


public class TestBuilder {

    /**
     * @param args
     */
    public static void main (String[] args) {
        
        System.out.println ("starting application ...");
        
        System.out.println (ResourceBundle.getBundle ("config.TestBuilder").getString ("text.output"));
                
        System.out.println ("exit application ...");
        
    }
}
```



```
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.4.2_13-b06 (Sun Microsystems Inc.)
Main-Class: de.test.TestBuilder
Class-Path: ./config
```


im jar-verzeichnis gibts den unterordner "config" und darin das file "TestBuilder.properties". jemand ne idee was falsch ist?


----------



## Tom299 (22. Aug 2007)

lol kaum hab ich es ins forum geschriebt hab ich die lösung selbst gefunden ...

--> Class-Path: .


----------



## oliver1974 (22. Aug 2007)

Dass der Class-Path in der ersten Ausführung falsch war, wundert mich nicht... Nur wundere ich mich, dass es jetzt geht!

Ich bin mir ziemlich sicher, dass ich einen korrekten Classpath drin hatte und er mir immer noch eine Fehlermeldung um die Ohren gehauen hat...

Du kannst jetzt echt aus dem Jar heraus auf ResourceBundles zugreifen, die nicht im Jar, aber im selben Verzeichnis (bzw. einem Unterordner) wie das Jar-Verzeichnis sitzen?
(Sollte ja z.B. bei Netbeans der "dist" Ordner sein...)

Komisch.. bei mir klappt das ums verrecken nicht..

Ich muss da nochmal einen ganz tiefen Blick riskieren..

EDIT: Bist du dir ganz sicher, dass das ResourceBundle auch nicht versehentlich im JAR miteingepackt worden ist?
Dann würde der nämlich das ResourceBundle im JAR referenzieren, nicht das im Ordner... Solltest du ja herausfinden könnten wenn du das ResourceBundle im Verzeichnis temporär entfernst oder mal ins Jar guckst.

Den "Pseudo-Erfolg" hatte ich nämlich auch schon.. bis ich merkte, dass die IDE (natürlich) den benötigten ResourceBundle brav mit ins Jar packte..


----------



## oliver1974 (22. Aug 2007)

Ja, da leg ich mich nieder... aber jetzt gehts bei mir auch...  :shock: 

Der Durchbruch kam, nachdem ich gerafft hatte, wie ich bei Netbeans die automatische Erstellung der Manifest-Datei und hier insbesondere der Klassenpfade einschränken und selbst übernehmen kann.... 
Da muss man aber auch erst drauf kommen: In der Ansicht "Files" (nicht "Project") sieht man ja die MANIFEST Datei.. das ist aber mehr eine Vorlage, die automatisch befüllt wird. aber sobald man z.B. unter Class-Path was einträgt, ist man selbst dann für diese Eigenschaft der Manifest Datei verantwortlich.

Nun war es dann auch ein leichtes, mit verschiedenen Class-Paths "herumzuspielen". Vorher war
das ein elendiges Gezupfe und Gezerre, da sich ja die ClassPath-Einträge nach den "Library"-Einträgen
für das Projekt richteten... und das passte irgendwie immer mal wieder hinten und dann wieder vorne nicht....

Zusammen mit einem Ant-Script, dass für die Anlage der benötigten Dateien/Ordner im dist-Verzeichnis sorgt und dem selbst geschnitzen Manifest klappt das ganze jetzt ziemlich gut, soweit ich das bisher sehe.

Da kann man mal wieder sehen, wie einem IDEs manchmal dazwischenfunken und Arbeit verursachen könnnen.


----------



## Tom299 (23. Aug 2007)

habe bei mir grad ein weiteres problem festgestellt.

meine-jar datei braucht noch andere jar-bibliotheken (z.b. spring). habe einen weiteren ordner mit dem namen lib angelegt und die benötigten jar-files alle in dieses verzeichnis kopiert und den classpath der manifest dann entsprechend erweitert --> Class-Path: .;lib bzw. Class-Path: .;./lib
beides funzt aber nicht, er kann die entsprechenden resourcen nicht finden. muß man das dem classpath irgendwie anders angeben? hab auch schon für eine einzelne datei Class-Path: .;lib/spring-core.jar bzw. Class-Path: .;./lib/spring-core.jar und Class-Path: .;spring-core.jar aber funktioniert nichts davon. kann mir einer weiterhelfen?

habe gesehen daß es auch oft so gemacht wird, daß man externe jar-files entpackt und dann in das eigene jar-file als unterordner/projekt aufgenommen wird. da suche ich auch schon die ganze zeit, wie man das im build-file von ant einstellt oder hinbekommt, finde aber nicht wirklich eine lösung dazu. jemand da eine idee?


----------



## Tom299 (23. Aug 2007)

ok habs doch selbst rausgefunden ...


```
<target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
    			<attribute name="Class-Path" value="."/>            	
            </manifest>
        	<zipgroupfileset dir="path/spring" includes="**/spring*.jar"/>
        	<zipgroupfileset dir="path/xmlrpc" includes="**/xmlrpc-2.0.jar"/>
        </jar>
    </target>
```

durch zipgroupfileset werden die benötigten jars entpackt und in mein eigenes jar wieder eingebettet


----------



## oliver1974 (24. Aug 2007)

Komisch, trotzdem hätte doch zumindest das explizite Angeben der einzelnen Jars im Classpath gehen müssen, ich mach das doch auch so in meinem Manifest-File...


----------

