System.getProperty zu Classloader

Status
Nicht offen für weitere Antworten.

PollerJava

Top Contributor
Hi,

Ich lese momentan alle externen Resourcen mit System.getProperty ein, möchte aber mein Programm auf ein Webstart-Programm umwandeln und daher den Classloader verwenden,

Funktioniert der Classloader auch bei normalen Anwendungen bzw wie kann ich System.getProperty auf den Classloader umwandeln ,

vielen Dank,


lg
 
äh ... wie meinen? System.getProperty auf den ClassLoader? System.getProperty gibt die aktuellen Systemvariablen aus. Und das sind bei WebStart (genauso wie bei jedem anderen J2SE-Programm) die Variablen des Rechners, auf dem das Ganze ausgeführt wird. Also auf dem Client.
 
Mit einer lokalen Anwendung greife ich mit System.getProperty() z.B. auf eine XML- Datei, Bilder usw zu,

Wenn ich jetzt dieses Programm mit Webstart starten möchte, dann kann ich mit System.getProperty nicht auf die XML- Datei oder Bilder zugreifen sondern muss so auf die externen Resourcen zugreifen:

Code:
ClassLoader cl = this.getClass().getClassLoader();             
            states = readStates(cl.getResource("Konfiguration/KonfigComponents.xml").toString());


Meine Frage wöre jetzt, ob das bei meinem lokalen Programm (also kein Webstart) auch so geht, dass ich mit dem ClassLoader auf die externen Resourcen zugreifen kann, denn dann kann ich dieses Programm auch für den WebStart hernehmen und habe nicht 2 unterschiedliche Programme (eines für Webstart und eine Applikation für den lokalen Computer)

lg
 
Was System.getProperty mit dem zugriff auf xml und bilder zu tun hat mag mir zwar nicht so ganz einleuchten, aber der ClassLoader ist natürlich genauso auch lokal vorhanden. Was hältst du eigentlich von "einfach mal ausprobieren" 😉 ?
 
Code:
states = readStates("file:///" + System.getProperty("user.dir") + "/Konfiguration/" + xmlDateiPfad);  
 Image img = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\"+ Control.getStatesElementAt(i).getIcon());

System.getProperty("user.dir") und getToolkit() kann ich ja für WebStart nicht verwenden jetzt suche ich halt nach dem gemeinsamen Nenner von WebStart- Programmen und "normalen" Applikationen, sodass ich aus meiner Applikation einfach ein WebStart- Programm machen kann,

Ausprobiert hab ichs schon, bekomme aber eine NPE mit dem ClassLoader();
 
Logischerweise, da ja Deine Bilder und die Konfig-Datei nicht beim anderen Benutzer zu finden sind.
Alles in deine JAR packen und von dort aus laden, das sollte auch über Webstart gehen.

lr
 
Dann wird

Code:
states = readStates("file:///" + System.getProperty("user.dir") + "/Konfiguration/" + xmlDateiPfad); 
Image img = getToolkit().getImage(System.getProperty("user.dir") + "\\pics\\"+ Control.getStatesElementAt(i).getIcon());

aber nicht funktionieren, denn so läd man nur externe Resourcen.

Was hält Dich denn davon ab, auch für deine nicht-Webstart Applikation die Resourcen ins JAR zu verlagern?

lr
 
Warum liegen die bei der Anwendung nicht auch im JAR? Zur Info:

ClassLoader greift IN das JAR ein, findet also auch nur Dateien, die im JAR liegen. Ob das jetzt WebStart ist oder nicht, ist bumbel.

und System.getProperty gibt keinesfalls das Verzeichnis zurück, in dem sich die main-class befindet, sondern lediglich von welchem Verzeichnis aus die main-class (bzw. jar) ausgeführt wurde.

Du legst deine Daten für eine "normale" Anwendung anders ab, als bei Webstart, und erwartest trotzdem, dass du für beide Anwendungen den selben Code verwenden kannst? Wie soll das denn gehen? Wenn ich zwei Häuser hab - bei einem steht das Auto in der Garage und beim anderen vor der Tür - kann ich ja auch nicht pauschal sagen "Egal, bei welchem Haus du bist, schau in die Garage!".
 
Wo muss ich das jar- File hinlegen damit der Classloader meine XML- Datei findet?
mein jar- file heißt jetzt KonfigComponents.jar -> in diesem gibt es einen Ordner Konfiguration und da drinnen ist meine xml- datei, der Classloader findet aber die Datei nicht (siehe fehlermenldung).

Was mache ich da falsch??


Code:
  ClassLoader cl = this.getClass().getClassLoader();             
  states = readStates(cl.getResource("Konfiguration/KonfigComponents.xml").toString());


Code:
java.lang.NullPointerException
        at net.pack.Control.<init>(Control.java:51)
        at net.pack.MainFrame.setLoginPfad(MainFrame.java:22)
        at net.pack.MainFrame.<init>(MainFrame.java:17)
        at net.dataserver.DataServer.main(DataServer.java:16)
 
OK verstehe, der Pfad ist bei mir

Code:
Das ist die URL: jar:file:/C:/Programme/Java/jdk1.6.0/jre/lib/ext/KonfigComponents.jar!/Konfiguration/KonfigComponents.xml

ich möchte die ganzen jars aber in meinem Projektverzeichnis haben und nicht meine ganzen jars in den Pfadd oben kopieren (sondern eben alles kompakt in meinem Projektverzeichnis)

geht das irgendwie?

lg
 
Liest du eigentlich, was man dir schreibt? Weißt du, wie man Google und die Forensuche bedient? Wenn die Dateien IM Jar liegen, dann verwende den ClassLoader und gebe nur den Pfad innerhalb des Jars an.
 
Ich habe nicht gemeint, daß Du nun die eine Konfig-Jar in die andere Jar packen sollst, sondern den Inhalt der KonfigJar in deine Jar.

lr
 
und wie kann ich den Pfad setzen, wo der ClassLoader sucht? Momentan sucht er in

Code:
Das ist die URL: jar:file:/C:/Programme/Java/jdk1.6.0/jre/lib/ext/KonfigComponents.jar!/Konfiguration/KonfigComponents.xml

ich will aber mein Programm kompakt haben und nicht die jars verstreunen?

Vielen dank für die Antworten
 
Der ClassLoader sucht immer in dem Jar, von welchem er aufgerufen wird. Ich versteh einfach dein Problem net. Sag uns doch einfach mal klipp und klar:

Von wo wird der ClassLoader aufgerufen
Wie wird er aufgerufen
Wo liegen die Dateien
Wo benötigst du die Dateien
... (sonstiges relevante evtl. auch noch)
 
Es muss dir net leid tun, dass es so lang gedauert hat, dass kommt vor. Aber wenn du genau definierst was du möchtest, was momentan nicht geht, und wovon das kommt, dann kann man dir auch leichter helfen 😉 .
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben