Hallo,
ich habe das Problem, dass eine jar-Datei welche ich aus einem Java project in Eclipse
exportiert habe, nicht funktioniert, während das Java project in Eclipse das tut.
Ich brauche zur Laufzeit den Inhalt einer xml-Datei, welche mit folgenden Zeilen geladen wird:
Code:
URL url = this.getClass().getResource("/data/simple.glade");
System.out.println(this.getClass());
if(url==null) System.out.println("url is null");
Die Ausgabe ist folgende:
Code:
$ java -jar Glade.jar
class org.testing.Simple
Exception in thread "main" java.io.FileNotFoundException:
Can't find the specified Glade XML file:
/home/korn/Desktop/file:/home/korn/Desktop/Glade.jar!/data/simple.glade
at org.gnome.glade.Glade.parse(Glade.java:142)
at org.testing.Simple.<init>(Simple.java:26)
at org.testing.Simple.main(Simple.java:50)
Der Inhalt der jar-Datei sieht so aus (unnötige Pfade ausgeblendet):
Der Code den du uns zeigt produziert keine FileNotFoundException, also bitte den entsprechenden Code nachreichen.
Warum bist du mit einem bugmenot account unterwegs? Gast Postings sind hier erlaubt.
Es ist ja auch keine Datei, sondern ein Entry in einer Jar.
Du kannst aber die URL oder den InputStream für so ziemlich alles in der Java API verwenden.
Ja, ist klar, daher die ergänzung in meinem Post (kam wohl zu spät). Die Frage ist, was macht die Methode mit dem String.
new File(path) wird scheitern. Wenn es etwas ist auf das du nicht verzichten kannst, wirst du eine temporäre Kopie erstellen müssen.
Mit getResourceAsStream bekommst du den InputStream.
Mit File.createTempFile() bekommst du eine Temporäre Datei.
Den InputStream mit einem FileOutputStream oder dessen FileChannel in die Datei schreiben.
Wenn du noch
tmpFile.deleteOnExit aufrufst, wird beim Programmende für dich aufgeräumt.
InputStream is = this.getClass().getResourceAsStream("/data/simple.glade");
System.out.println(this.getClass());
if(is==null) System.out.println("url is null");
File f = File.createTempFile("simple", "glade");
FileOutputStream os = new FileOutputStream(f);
byte by;
while(( by = (byte) is.read())!=-1) {
os.write(by);
}
f.deleteOnExit();
glade = Glade.parse(f.getName(), "Simple");
Ich versuche also den Inhalt des InputStreams in den OutputStream, das heißt die temporäre Datei zu schreiben.
Allerdings erhalte ich die Fehlermeldung:
Code:
Exception in thread "main" java.io.FileNotFoundException:
Can't find the specified Glade XML file:
/home/korn/workspace/Glade/simple9326glade
at org.gnome.glade.Glade.parse(Glade.java:142)
at org.testing.Simple.<init>(Simple.java:38)
at org.testing.Simple.main(Simple.java:62)
Und zwar benutze ich Klassen aus einer anderen Library (Glade z.B.)
um diese benutzen zu können, habe ich die binaries entpackt und als
Library zum Projekt hinzugefügt, wodurch es um einige tausend Dateien
größer wurde.
Wenn ich diesen Balast allerdings weglasse und die Library an den Classpath anhänge,
dann wird wohl die Library nicht gefunden oder nicht durchsucht.
Gar nicht. Dir bleiben in etwa folgende Optionen:
-einen Starter schreiben
-relative Pfade mit der Hoffnung das der User die jar im richtigen Verzeichnis ausführt
-Webstart
-Installer