Frage zu jar

hallo,

eine frage: ich habe meine class-files, sowie benötigte icons und daten-files aus denen gelesen wird zu einem jar-file zusammengefasst:
die icons und die daten-files sind jeweils in unterverzeichnissen.

ich kann auch alles schön und gut ausführen mit
java -jar project.jar

aber nur solange die daten/icon-files auch noch ausserhalb des jars in den verzeichnissen liegen. wie stell ich es an, dass er die daten/icon-files aus dem jar-archive nimmt?

muss ich meine manifest.mf entsprechend verändern? momentan gebe ich nur version und main-class an.

gruss
christian

Hallo,

Um die Resourcen aus dem Jar-File zu nutzen, kannst Du Dich folgender Möglichkeit bedienen:

ClassLoader.getSystemResource("ResourcenPfad")

wobei für den relativen Pfad in deinem JAR steht.
(wenn Du also ein Paket namens „mein.paket.fuer.resourcen“ hast und darin die „bsp.gif“ liegt, dann ist der ResourcenPfad=„mein/paket/fuer/resourcen/bsp.gif“)

Als Ergebnis der Methode bekommst Du eine URL, die Du mit URL.openStream öffnest.

Ich denke, das hilft Dir weiter.

Falls nicht, dann schreib eine eMail an mich !

Hi Lars,

danke für deine Antwort. Sie war schon sehr hilfreich, er holt sich die Icons nun aus dem Jar-Archive. allerdings bei einer Kleinigkeit bin ich doch hängengeblieben. aus dem verzeichnis data soll er sich ein xml-file holen, dass er dem DocumentBuilder übergibt. Der nimmt aber keine Url. ANbei ein ausschnitt, wie muss ich den Code anpassen?

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
try {
 DocumentBuilder builder = factory.newDocumentBuilder();
 builder.setErrorHandler( new org.xml.sax.ErrorHandler() {
 public void fatalError(SAXParseException exception) throws SAXException { }
 public void error(SAXParseException e) throws SAXParseException { throw e; }
 public void warning(SAXParseException err) throws SAXParseException {
 System.out.println("\*\* Warning" + ", line " + err.getLineNumber() + ", uri " + err.getSystemId());
 System.out.println(" " + err.getMessage());
 }
 });
// document = builder.parse( new File(filename) );
 document = builder.parse( new URL(ClassLoader.getSystemResource(filename)) );

so funktioniers leider noch nicht. das ausdokumentierte hatte ich zuvor drin…

Danke und Gruss
Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Christian,

Da hab ich 2 Anmerkungen:

  1. ClassLoader.getSystemResource(java.io.File) erzeugt Dir bereits ein URL-Objekt, so dass Du nicht noch ein URL-Objekt explizit per „new URL(URL)“ erstellen musst.

document = builder.parse( new URL(ClassLoader.getSystemResource(filename)) );

  1. Als Lösung zu Deinem XML-Problem: DocumentBuilder implementiert mehrere parse()-Methoden. U.a. auch eine Methode, der Du einen InputStream uebergeben kannst:
    http://java.sun.com/xml/jaxp/dist/1.1/docs/api/javax…

Als Ersatz für Deine auskommentierte Zeile solltest Du dann schreiben:

document = builder.parse(ClassLoader.getSystemResource(filename).openStream());

Sollte funktionieren.

Tschoe, meld Dich, wenn’s noch mehr Probleme gibt !

Bis denn, Lars

1 „Gefällt mir“

Hi Lars,

dank deiner Codezeile funktioniert das einlesen nach wie vor. Bloss wen ich die Anwendung über das jar-file starte schmeisst er eine Exception. Ich hab dir die Ausgabe mal mit reingehängt. Um sicherzustellen, dass in auch wirklich was drinsteht, hab ich den Inhalt vorher ausgegeben, bevor er versucht, drauf zuzugreifen.

C:\Daten\java\jar\>java -jar sim.jar
data\23.xml
Exception in thread "main" java.lang.NullPointerException
 at parseLog.parse(parseLog.java:138)
 at parseLog.(parseLog.java:86)
 at Display.(Display.java:156)
 at Sim.main(Sim.java:49)

Weisst du hier weiter?

Gruss
Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hab Dir eine Mail geschickt !

1 „Gefällt mir“