PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit JAR Archiv und Pfadproblem mit eingebundenen Ressourcen


RMC
2006-10-23, 18:00:35
Hallo,

Ich bin im Begriff eine Bibliothek zu erstellen, die unter anderem Standard-Ressourcen mit bestimmten Fonts verwenden soll. Um sie mit diesen Ressourcen auszuliefern dachte ich mir, es wäre gut, wenn diese ebenfalls im JAR-Archiv sind, sonst macht das wenig Sinn. Also habe ich sie dazugepackt. Mein Archiv "library.jar" hat also folgende Struktur:



library.jar

- META-INF
- library
- fonts
- irgendeinFont.ttf



So...wenn ich jetzt ein Programm schreibe, welches "library.jar" enthält kommt dies natürlich ins "lib" Verzeichnis dieses Programms.



Testprogramm

- doc
- classes
- src
- ../../lib/library.jar



Der lib Ordner liegt - strukturbedingt - 2 Ordner höher, das sollte eigentlich kein Problem sein wenn das mit Classpath richtig eingebunden ist. Das funktioniert auch ohne Probleme, die Bibliothek wird gefunden, die Klassen können verwendet werden.

Im Code der "library" wird nun auf "fonts/irgendeinFont.ttf" verwiesen. Allerdings kann diese Ressource dann nicht gefunden werden.


Was ist hier der Fehler?
Danke!

ethrandil
2006-10-23, 19:48:45
Also bei mir funktioniert das, in der folgenden Form:

Im jar liegt im Verzeichnis de/ethrandil/jpiemenu die Datei 'right.gif'. In diesem Package liegt auch die Klasse JPieMenuTest.

URL url = JPieMenuTest.class.getResource("right.gif");
Icon icon = new ImageIcon(url);

vielleicht hilfts ja,
- eth

RMC
2006-10-23, 20:04:07
Kannst du genau angeben wie dein Archiv ausschaut und wo sich die Klasse befindet die die Ressource ausliest?

EDIT:

oder würd es in meinem Fall heißen (bezogen auf die Struktur aus dem Anfangspost):


File font_file = Manager.class.getResource("fonts/irgendeinFont.ttf").getFile();
Font font = Font.createFont(Font.TRUETYPE_FONT, font_file);


da haperts aber an irgendwas, krieg an Nullpointer :(
Scheint nicht zu funktionieren...sofern "getResource()" mir eine beliebige Ressource aus dem jar-Archiv liefert

Danke :)

ethrandil
2006-10-23, 21:12:40
Pack mal die Datei irgendeinFont.ttf in das selbe Verzeichnis, wie die Manager.class-Datei. Dann sollte der Aufruf Manager.class.getResource("irgendeinFont.ttf") funktionieren.
Wie das mit unterverzeichnissen ist, habe ich noch nicht geprüft.

- eth

RMC
2006-10-23, 21:44:49
Pack mal die Datei irgendeinFont.ttf in das selbe Verzeichnis, wie die Manager.class-Datei. Dann sollte der Aufruf Manager.class.getResource("irgendeinFont.ttf") funktionieren.
Wie das mit unterverzeichnissen ist, habe ich noch nicht geprüft.

- eth

Na funktioniert nicht. Der Font liegt jetzt dort wo die class-Files sind, aber selbst dann gehts nicht. Ich bekomm die IOException:


java.io.IOException: Can't read file:\D:\...\...\...\...\...\Projectfolder\lib\library.jar!\library\font.ttf


die Frage die sich mir auftut: der Pfad stimmt prinzipiell, aber was macht das Rufzeichen da mittendrin nach der .jar extension? :| Ich hab ganz sicher nirgends an Tippfehler drin, hab das schon geprüft.

ethrandil
2006-10-23, 22:05:20
Darf ihc fragen, wer die Exception wirft?

Vielelicht bedeutet das Ausrufezeichen, dass das kein echter Pfad, sondern ein Pfad in einem Jar ist.

- eth

RMC
2006-10-23, 22:09:19
Darf ihc fragen, wer die Exception wirft?

Vielelicht bedeutet das Ausrufezeichen, dass das kein echter Pfad, sondern ein Pfad in einem Jar ist.

- eth


at java.awt.Font.createFont wirft die Exception in diesen 2 Zeilen:

File font_file = Manager.class.getResource("irgendeinFont.ttf").getFile();
Font font = Font.createFont(Font.TRUETYPE_FONT, font_file);



Das Ausrufezeichen könnte vielleicht nur Text sein der falsch platziert ist von der Ausgabe..? Vielleicht gehört das hinter "Can't read file...!"

ethrandil
2006-10-23, 22:21:57
File font_file = Manager.class.getResource("irgendeinFont.ttf").getFile();
Font font = Font.createFont(Font.TRUETYPE_FONT, font_file);


versuchs mal mit

URL fontUrl = Manager.class.getResource("irgendeinFont.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());

Ich denke das ist nicht so einfach, wenn man eine komische Jar-URL einfach als File verwenden will.

- eth

RMC
2006-10-23, 22:43:45
versuchs mal mit

URL fontUrl = Manager.class.getResource("irgendeinFont.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());

Ich denke das ist nicht so einfach, wenn man eine komische Jar-URL einfach als File verwenden will.

- eth

o..k..das hat jetz funktioniert. thx :)

Jetzt hab ich noch probiert die resourcen in ein eigenes Verzeichnis außerhalb des class-Ordners zu bringen, aber da will dann auch der angepasste Pfad partout nicht mehr.

Im class-Ordner will ich die eig. net wirklich haben, das ist so komplett unübersichtlich.

Senior Sanchez
2006-10-23, 23:00:39
Damit habe ich mich auch schon zig mal rumgequält.
Bei mir hats immer geholfen, dass über den ClassLoader zu machen. Um das einmal abzufackeln, habe ich mir auch eine Klasse ResLoader geschrieben. Das folgende musste natürlich auf deine Klasse aus der auf eine Resource zugegriffen werden soll anpassen:


ClassLoader loader = ResLoader.class.getClassLoader();

return loader.getResource(path);


path ist dabei ein String, der praktisch eine relative Pfadangabe innerhalb des classes-Ordner zugreift.
Bsp.

return loader.getResource("img/question32.jpg");

liefert mir die jpg-Datei die sich unter img ganz oben im classpath befindet.
Also bei mir sieht die jar-Datei dann so aus:

Bla.jar
|-- de
|-- img
|-- META-INF

usw.

Monger
2006-10-24, 08:23:49
Darf ich den Thread hier mal hijacken?
Zu den JARs hätte ich nämlich auch eine Frage: kann man verhindern dass ein JAR entpackt werden kann, aber trotzdem noch ausgeführt werden kann?

Hintergrund ist der, dass ich jemanden kenne der gerne bestimmte Konstanten in eine XML Datei o.ä. auslagern möchte, aber Angst hat dass diese dann vom Anwender manipuliert wird. Ich dachte ich hätte mal was von JAR Versiegelung gehört, so dass man alles ins JAR reinpacken und dann versiegeln kann. Kann mir jemand einen Tipp geben ob und wie es geht, oder wo ich mehr Infos dazu finde? :)

Köppchen
2006-10-24, 23:03:46
Für jars gibt es möglichkeiten diese digital zu signieren (http://java.sun.com/docs/books/tutorial/deployment/jar/signindex.html). Das haben wir früher genutzt um eigene Applets die im Browser laufen zu unterschreiben. Ob das für deinen Zweck das richtige ist kannst du dir bei sun durchlesen. Ich fürchte eher nicht, denn wenn man das jar entpackt kann man diese auch selber wieder mit einem anderen Manifest zusammenpacken.

Monger
2006-10-25, 17:01:23
Nein, das ist leider nicht was ich suche! :(

Wie läuft das denn üblicherweise bei kommerzieller Software in Java? Was macht man denn mit den ganzen Bildern, Daten etc. die gebraucht werden. Die packt man doch ins JAR Archiv rein, oder?