Dateien in JAR-File einbinden

Tinipieps

Mitglied
Hallo!
Ich habe versucht mein bestehendes Programm so zu ändern, dass ich alle Dateien, wie z.B. Bilder oder die Config-Datei, in Packages packe, damit ich Sie später im JAR-File integriert habe.

Der Code, um Bilder aufzurufen, funktioniert bestens:
Code:
new ImageIcon(getClass().getResource("/images/Mail-icon.png"));

Der Code, um die Config-Datei aufzurufen funktioniert leider nicht:
Ich bekomme eine FileNotFoundException, obwohl die Datei in dem angegebenen Pfad existiert.

Code:
DocumentBuilderFactory factory = DocumentBuilderFactory.
			newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			URL url = ServerConfig.class.getResource("/config/config.xml");
			Document document = builder.parse(new File(url.getFile()));

liefert folgende Fehlermeldung:
Code:
java.io.FileNotFoundException: D:\Eclipse\eclipse_test_neu\eclipse\workspace\E-Mail-Client%20verbessert\bin\config\config.xml (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

Kann mir jemand sagen, was ich falsch gemacht habe?
 
Der Code, um Bilder aufzurufen, funktioniert bestens:

Stimmt nur bedingt:
In Eclipse funktioniert alles Bestens, aber bei Aufruf der Jar bekomme ich folgenden Fehler:
Code:
Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at client.Client.createGUI(Client.java:263)
        at client.Client.<init>(Client.java:163)
        at application.Application.main(Application.java:14)

Zeile 263 in Client.class:
Code:
 empfHinzu = new JMenuItem("Empfänger auswählen", 
        					new ImageIcon(getClass().getResource(
    								"/images/user-icon.png")));

Kann mir jemand sagen, was ich falsch gemacht habe?
 
Moin,

also ich verwende bei mir hier (unter XP) immer doppelte Backslashes, also so :
Java:
new ImageIcon(getClass().getResource( "\\images\\user-icon.png")) );

Hast Du es ggf. mal mit absoluter Pfadangabe versucht ?

Gruß
Klaus
 
Howdie.

@vfl_freak:
Java kann IMHO immer was mit normalen Slashes anfangen (ist ja Standard-Syntax für Java). Doppelte Backslashes brauchst meines Wissens nur, wenn du beispielsweise einen Windows-Prozess o.Ä. starten willst - also Pfade an das umgebende OS übergeben willst. Und absolute Pfade sind in einem Jar nicht emfpehlenswert, da die Portierbarkeit flöten geht. Ich dachte auch gar nicht, dass es überhaupt möglich ist, auf Dateien im JAR über absolute Pfade zuzugreifen. Aber ich lass mich gern eines Besseren belehren.

@Tinipieps:
Damit hatte ich auch immer wieder Schwierigkeiten, es kommt da echt auf ein paar Feinheiten im Syntax an. Ich weiß nicht, wie ich deinen Code modifizieren würde, um ihn lauffähig zu machen, aber ich poste dir mal beispielhaft wie ich sowas löse.

ImageIcons:
Java:
// ImageIcon hat einen Konstruktor, der java.net.URLs entgegennimmt
ImageIcon myIcon = new ImageIcon(ClassLoader.getSystemResource("my/data/package/myIcon.png"));

XML-Dateien:
Für XML benutze ich JDOM. Daher kann ich dir hier nicht zeigen, wie es mit dem DocumentBuilder funkioniert.
Java:
URL configURL = ClassLoader.getSystemResource("my/data/package/config.xml"); // java.net.URL
SAXBuilder builder = new SAXBuilder(); // aus der JDOM-Lib
Document doc = builder.build(configURL.toString());   // auch aus der JDOM-Lib

Gruß und viel Erfolg,
miffi
 
Zurück