dommes89 Geschrieben 26. Februar 2009 Teilen Geschrieben 26. Februar 2009 (bearbeitet) Hallo, Und zwar wollte ich mein Programm kompilieren und dann in ne .JAR packen, sodass man es einfach so ausführen kann. Jetzt ist mir ein total unerklärliches Problem aufgetaucht bzw. sogar 2!: Meine Klasse befindet in einem Package "chat" ... dieses Package enthält noch einen Ordner "smilies"... So muss ich in meiner Klasse die Smilies aufrufen (wenn ich das Programm in Eclipse teste): static String icon_path = "bin/chat/smilies/"; . . . . // Icons try{ File dir = new File(icon_path); File[] fileList = dir.listFiles(); i = 0; icons = new ImageIcon[fileList.length]; for(File f : fileList) { try{ icons[i] = new ImageIcon(icon_path+f.getName()); }catch(IndexOutOfBoundsException df){ } i++; } }catch(NullPointerException npe){ } In einem Beispiel File jedoch sieht der Pfad folgendermaßen aus, OBWOHL dort die Klasse ebenfalls sich in einem Package befindet und der Ordner für die Grafiken sich ebenfalls in diesem Package befindet: ("images/Pig.gif", "a cute pig") Jetzt als erstes mal, wieso brauche ich zum ausführen bei meinem File noch das "bin" und den Packagename im Pfad? Als zweites und wichtigeres: wieso funktioniert das 2. Beispiel wenn ich es in ein .JAR Packe und das 1. nicht? auch wenn ich beim 1. Beispiel vorher den Pfad dem 2. Beispiel angleiche??? Das ist äußerst rätselhaft... Ich hoffe einer hat eventuell ne Idee.... Gruß Bearbeitet 26. Februar 2009 von dommes89 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zui2000 Geschrieben 26. Februar 2009 Teilen Geschrieben 26. Februar 2009 (bearbeitet) bin - Verzeichnis: Deine Klassen werden aus dem src - Verzeichnis compiliert und die compilierten .class Dateien werden im "bin" abgelegt. Nun kannst du die Klasse im "bin" ausführen. Wenn du eine Datei mit in den src Ordner legst, dann wird diese natürlich nicht kompiliert und kommt auch nicht in den "bin" Ordner. Einfachste Weg: einen neuen Orderner in dem projekt erstellen, auf der selben Ebene wie src und bin. Dann im Quellcode: z.b. "data/smilies/images/Pig.gif" src - .java dateien bin - .class dateien data - alle möglichen anderen Ressourcen *Ordnername frei wählbar, data ist nur ein Beispiel Edit: du kannst den data Ordner dann auch mit in die JAR Datei packen lassen, wobei man es lieber nicht mit rein packt und den data Ordner dann mit in das Verzeichnis kopiert wo die JAR ist Bearbeitet 26. Februar 2009 von zui2000 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 26. Februar 2009 Autor Teilen Geschrieben 26. Februar 2009 Okay nach reichlichem Suchen etc. habe ich herausgefunden, dass File() nicht in .jar dateien funktioniert bzw. man nur bestimmte dateien aufrufen kann... Weiss einer wie ich in .jar Dateien Verzeichnisse durchsuchen kann? Gruß. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 26. Februar 2009 Autor Teilen Geschrieben 26. Februar 2009 Ja, also das mit dem bin und src weiss ich.. den Ordner außerhalb vom .jar file anzulegen kommt leider nicht in frage.. Okay ich werde es mal ausprobieren ob es möglich ist wenn ich den ordner ins stammverzeichniss des jar files lege... Danke. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zui2000 Geschrieben 26. Februar 2009 Teilen Geschrieben 26. Februar 2009 Weiss einer wie ich in .jar Dateien Verzeichnisse durchsuchen kann? JAR ist im Endeffekt sehr vereinfacht gesagt sowas wie eine ZIP. Also suche nach einer Möglichkeit gepackte Daten auszulesen. Bzw. kannst du das JAR in einen temp Ordner auspacken und dann den Ordner durchsuchen. Sollte aber auch leichter möglich sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 26. Februar 2009 Autor Teilen Geschrieben 26. Februar 2009 Also das mit deiner Idee die Dateien in einen Anderen Ordner zu legen hat nicht geklappt... zwar beim ausführen in eclipse usw. jedoch nicht nach dem Packen in .jar.. D.h. ich werde wohl wirklich das ganze über ZIP archiv oder irgendwas auslesen müssen. Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zui2000 Geschrieben 26. Februar 2009 Teilen Geschrieben 26. Februar 2009 Startest du das JAR per Doppelklick? versuchs mal damit: Auf der Shell in den Ordner wechseln wo die JAR liegt und dann eintippen "java -jar deinJarName.jar" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 26. Februar 2009 Autor Teilen Geschrieben 26. Februar 2009 ja tue ich... ja hab e ich probiert, bringt aber nichts... und das mit dem im .jar verzeichnisse auslesen bekomm ich auch noch nicht so auf die reihe.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 26. Februar 2009 Teilen Geschrieben 26. Februar 2009 Servus, Du musst das JAR nicht auspacken. Über Class#getRessource oder Class#getRessourceAsStream kannst Du auf Ressourcen in Deinem Classpath zugreifen. Wenn Deine Datei im JAR ist, liegt sie im Classpath und kann dann auch gelesen werden. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 26. Februar 2009 Autor Teilen Geschrieben 26. Februar 2009 Okay, also ich habe es nun hinbekommen mein gewünschtes verzeichnis auszulesen... somit werd ich das dann hinbekommen. JarFile jf = new JarFile(filename); Enumeration e = jf.entries(); while (e.hasMoreElements()) { JarEntry je = (JarEntry) e.nextElement(); if(je.getName().contains(icon_path)){ String name = je.getName(); System.out.println(name); } } Was nun noch ein Problem ist: der filename?! Wie bekomme ich den filename des .jar archives heraus... z.B. fall es umbenannt wurde. ich hatte da heute schon irgendwas mit class.getRessource() gesehen ja... aber ich weiss nicht mehr wie das war... Kannst du das genauer erläutern? Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 26. Februar 2009 Autor Teilen Geschrieben 26. Februar 2009 Okay habe nun rausgefunden wie man das Stammverzeichnis, also den Name des .jar Files, der Klasse herausfindet: File filename = new File(ChatClient.class.getProtectionDomain().getCodeSource().getLocation().toURI()); Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zui2000 Geschrieben 26. Februar 2009 Teilen Geschrieben 26. Februar 2009 nene, wenn du deine icons mit in das Jar file rein packst, dann kannst du einfach so darauf zugreifen: java.net.URL imgURL = ResourceManager.class.getResource( "chat/smilies/foo.png" ); if (imgURL != null) { return new ImageIcon( imgURL, iconDescr ); } else { System.err.println( "Couldn't find file" ); } Geht aber auch nur, wenn die Datei mir in der JAR ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 26. Februar 2009 Autor Teilen Geschrieben 26. Februar 2009 ich kenne aber die dateinamen nicht^^ das ist ja gerade das Problen^^ ich habe das alles so geschrieben, dass ich einfach nur wenn ich ein icon mehr haben möchte, eines in den ordner dazu legen muss^^ er soll dort ja dann durch iterieren und dann anhand der verfügbaren files die icons erstellen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zui2000 Geschrieben 26. Februar 2009 Teilen Geschrieben 26. Februar 2009 Du kannst doch einfach das URL Objekt an ein File Objekt übergeben und die Url nur bis zum Ordner definieren. Dann file.isDirectory() -> file.listFiles() Scho haste alle Dateien als FileObjekte in einem Array und kannst die nach Namen abfragen und wenn nötig als Icon verwenden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 27. Februar 2009 Teilen Geschrieben 27. Februar 2009 Vielleicht willst Du auch noch mal Deinen Ansatz überdenken. Ein JAR ist dazu da, dass Du eine Anwendung darin komplett ausliefern kannst. Wenn jetzt ein neues Icon hinzukommen soll, soll der Anwender dann das JAR entpacken, ein Icon hineinlegen, zippen und als JAR umbenennen? Wenn Du die Dateien "von außen" verfügbar haben willst, dann lass sie am besten auch außerhalb des JARs. Erklär mal, was Du wirklich machen willst. Dann kann man eher sagen, was Du machen kannst. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dommes89 Geschrieben 27. Februar 2009 Autor Teilen Geschrieben 27. Februar 2009 (bearbeitet) Also.. Ich habe für unsere FI-Klasse nen Chat gebastelt.. für die Schule, der auch funktionieren soll, ohne dass das Internet im Raum freigeschaltet wurde. Es liegen ein paar dateien in einem Tausch Verzeichnis auf dem Server, der immer verfügbar ist, in die die Daten gepeichert werden... z.B. der Chatlog.. Die Icons wollte ich deswegen extra mit in das File packen, damit sie nicht irgendwo auf dem Server rumliegen und dies jemand dann bemerkt. Das ist ja auch kein Problem, denn sobald ich ich einer Datei, auf die beim ausführen des Files immer überprüft wird, ändere (die Versions-Nummer des Chats) zieht sich die Datei automatisch die Version im Ordner aufm Server und überschreibt sich, sollte die Version nicht übereinstimmen... Also Packe ich irgendwann mal neue Smilies rein, dann bekommen die Leute die das File nutzen sicher beim nächsten ausführen nach dem nächsten start. Und ausserdem habe ich ja nicht vor dort jeden Tag neue Smilies reinzupacken, das war einfach nur für mich ne Vereinfachung, damit ich, wenn ich nicht irgendwann dort neue Icons einfüge, den ganzen Quellcode nochmal ändern muss... so stecke ich einfach smilies rein, oder nehm welche raus, ändere die Versions-Nummer und dann passt die Sache... Es läuft ja jetzt auch alles inzwischen.. ich hab das dann alles hinbekommen... Also hier mal der Code wie ich das jetzt mache: File filename = new File(ChatAdmin.class.getProtectionDomain().getCodeSource().getLocation().toURI()); /** Icons for run class in .jar */ if(filename.getName().contains(".jar")){ icon_path = "jar:"+filename.toURI()+"!/data/smilies/"; JarFile jf = new JarFile(filename); Enumeration e = jf.entries(); int entryCount = -1; while (e.hasMoreElements()) { JarEntry je = (JarEntry) e.nextElement(); if(je.getName().contains("data/smilies/")){ String name = je.getName(); entryCount++; } } try{ Enumeration z = jf.entries(); i = 0; icons = new ImageIcon[entryCount]; while (z.hasMoreElements()) { JarEntry je2 = (JarEntry) z.nextElement(); if(je2.getName().contains("data/smilies/")){ String name = je2.getName(); try{ URL imgURL = ChatAdmin.class.getResource(name); icons[i] = new ImageIcon(imgURL); }catch(IndexOutOfBoundsException df){ } i++; } } }catch(NullPointerException npe){ } /** Icons for run class in .java */ }else{ // Sets icon_path icon_path = "data/smilies/"; try{ // Looks into the file directory File dir = new File(icon_path); File[] fileList = dir.listFiles(); i = 0; icons = new ImageIcon[fileList.length]; for(File f : fileList) { try{ // defines all smilies icons[i] = new ImageIcon(icon_path+f.getName()); }catch(IndexOutOfBoundsException df){ } i++; } }catch(NullPointerException npe){ } } Also am anfang überprüft er erstmal ob ich das Teil so rennen lass oder als .jar Datei, und je nach dem baut er sich halt die Icons dann zusammen. Gruß Dominik Bearbeitet 27. Februar 2009 von dommes89 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.