1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Eclipse JAR Bilder ausführbar

Dieses Thema im Forum "Java" wurde erstellt von Atlanx, 29. Juli 2004.

  1. Atlanx

    Atlanx Grünschnabel

    Hallo an alle.

    Ich versuche jetzt seit 2 Tagen mein Projekt in ein ausführbares JAR-File zu packen.
    [Eclipse 3.0, Java 1.4.2_04]
    Ersteinmal die gute Nachricht: In Eclipse lässt es sich wunderbar ausführen.

    Also, Eclipse scheint nicht fähig zu sein damit ein ausführbare JAR-File zu erstellen
    und natürlich hab ich auch schon die Beiträge in diesem Forum dazu gelesen und mich mit Google vergnügt, aber das hat mich leider auch nicht weiter gebracht.

    Also, ich hatte 2 Möglichkeiten:
    1: Von Hand mit einem Manifest
    2. Per ANT mit einem build.xml
    ( Anleitung hier im Forum )

    Ich hab mich jetzt für die 1 entschieden, da 2 zwar wunderschön ohne Fehler kompiliert, aber dann trotzdem nicht funktioniert und die Fehlermeldung keine Anhaltspunkte liefert (Fatal Exception occured).

    So, ersteinmal die Struktur meines Projektes:
    Code (Text):
    1.  
    2. Transviewer
    3.      |
    4.      | -- doc
    5.      | -- bin
    6.      | -- meta -- manifest.mf
    7.      | -- src
    8.            |
    9.            | -- images
    10.            | -- de
    11.                   | -- transview
    12.                              |
    13.                              | -- test2.java
    14.                              | -- helpfile.html
    15.                              | -- trans.ini
    16.  
    Inhalt der manifest.mf
    Code (Text):
    1.  
    2. Manifest-Version: 1.0
    3. Main-Class: de.transview.test2
    4.  
    Die Klasse test2.java enhält alle Methoden und die Mainklasse:
    Code (Text):
    1.  
    2. "Auszug":
    3.  
    4. package de.transview;
    5.  
    6. import  java................
    7.  
    8. public class test2 extends JFrame implements ActionListener { ..
    9.  
    10.  

    Also, bin jetzt in das src Verzeichnis gewechselt und hab das ganze mal übersetzt:

    javac de/transview/test2.java

    Dann das JAR-File erzeugt:

    jar cvfm transview.jar ../meta/manifest.mf de images

    Dann nach D:\ kopiert und ausgeführt:

    java -jar transview.jar

    Folgende schöne Fehlermeldung erscheint:

    Code (Text):
    1.  
    2. B:class de.transview.test2
    3. A:jar:file:/D:/transview.jar!/images/icon16x16.png
    4. Exception in thread "main" java.lang.NullPointerException
    5.         at javax.swing.ImageIcon.<init>(Unknown Source)
    6.         at de.transview.MyMenu.<init>(test2.java:2782)
    7.         at de.transview.test2.<init>(test2.java:278)
    8.         at de.transview.test2.main(test2.java:223)
    9.  
    A und B hab ich zur Fehlersuche eingebaut, wobei
    B: von
    Code (Text):
    1. System.out.println("B:"+ getClass());
    A: von
    Code (Text):
    1. System.out.println("A:"+ getClass().getResource( "/images/icon16x16.png") );
    kommt.
    Also, wie gesagt, unter Eclipse kann ich damit ohne Probleme auf die Bilder zugreifen, aber sobald die in dem JAR-File stecken, findet das Javaprogramm die anscheinend nicht mehr.
    Man beachte das schöne ! zwischen .../transview.jar!/images....

    Wie kann ich auf die Bilder zugreifen, wenn sie im JAR-File drin sind?

    Wenn Du einen Vorschlag hast, und sei er noch so klein oder abwegig. Bitte schreib
    ihn hier rein. Ich weiß jetzt jedenfalls nicht mehr weiter.

    MfG Atlanx
    Zuletzt bearbeitet: 30. Juli 2004
  2. Atlanx

    Atlanx Grünschnabel

    Ich habs gefunden.

    Es funktioniert so, wie ich es beschrieben hab.
    Nur hatte sich in einem
    Code (Text):
    1.  
    2. getResource( "/images/icon16x16.png") )
    3.  
    ein großes C (iCon) statt einem kleinen c(icon) eingeschlichen.

    Eclipse und Java hat das nicht gestört, aber als JAR gings dann halt nicht mehr.

    Und mit dem XML-File und ANT geht es jetzt auch zum übersetzen. Yeah!
    Zuletzt bearbeitet: 30. Juli 2004
  3. Thomas Darimont

    Thomas Darimont Administrator

  4. Atlanx

    Atlanx Grünschnabel

    So, Bilder und HTML-File gehen, aber ich müsste auch noch ein Iniffile
    aus src -- de -- transview -- trans.ini
    einlesen.

    Allerdings kann RandomAccessFile() nichts mit der URL anfangen, die
    getClass().getResource( "/de/transview/trans.ini") liefert.

    Code (Text):
    1.  
    2.   String inipath = getClass().getResource("/de/transview/trans.ini").toString();
    3.  
    4.   // liefert:  jar:file:/D:/Documents%20and%20Settings/../transview.jar!/..../trans.ini
    5.  
    6.   File x = new File( inipath );
    7.  
    8.  try {
    9.           RandomAccessFile f = new RandomAccessFile( x , "r");  
    10. ....
    11.  
    und
    Code (Text):
    1.  
    2.  System.out.println( (getClass().getResource("/de/transview/trans.ini")).getFile() );
    3. //liefert:  /D:/Documents%20and%20Settings/../transview.jar!/..../trans.ini
    4.  
    Funktioniert auch nicht.

    Unter anderem funktioniert es wahrscheinlich wegen den %20 nicht.

    Wie komme ich an einen Pfad in diesem JAR-File heran, der sowohl unter Win als auch Unix funktioniert?


    MfG Atlanx.
    Zuletzt bearbeitet: 30. Juli 2004
  5. Thomas Darimont

    Thomas Darimont Administrator

  6. Atlanx

    Atlanx Grünschnabel

    Danke für die Links.

    Ich hab jetzt also den Pfad mit URLDecoder.decode() dekodiert.

    Code (Text):
    1.  
    2.  String inipath_in = getClass().getResource("/de/transview/trans.ini").toString();
    3.  File x = new File( inipath_in );
    4.        
    5.   // URL decoden
    6.   // Bug in Java bis mindestens 1.4            
    7.   String inipath_use = java.net.URLDecoder.decode( inipath_in );
    8.   System.out.println("|T|"+ inipath_in );
    9.   System.out.println("|L|"+ inipath_use + "\n" );
    10.    
    11.   try {
    12.          RandomAccessFile f = new RandomAccessFile( inipath_use , "r");
    13. ....
    14.  
    Ausgabe:
    Code (Text):
    1.  
    2. |T|jar:file:/D:/Documents%20and%20Settings/TAMA/My%20Documents/Eclipse_Workspace/Transviewer/bin/de/transview/trans.ini
    3. |L|jar:file:/D:/Documents and Settings/TAMA/My Documents/Eclipse_Workspace/Transviewer/bin/de/transview/trans.ini
    4.  
    5. java.io.FileNotFoundException: jar:file:\D:\Documents and Settings\TAMA\My Documents\Eclipse_Workspace\Transviewer\bin\de\transview\trans.ini (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
    6.  
    Funktionieren tut es halt immer noch nicht (-_-);

    MfG Atlanx.
    Zuletzt bearbeitet: 30. Juli 2004
  7. Atlanx

    Atlanx Grünschnabel

    So gehts:

    Code (Text):
    1.  
    2. URL u = getClass().getResource("/de/transview/trans.ini");
    3. try {
    4.             BufferedReader fileread =
    5.               new BufferedReader(new InputStreamReader( u.openStream() )  );
    6.  
    7.            String line;
    8.             while( (line = fileread.readLine()) != null )
    9.             {
    10.                   System.out.println("out: "+line);
    11.             }  
    12.             fileread.close();
    13.       }
    14. catch (IOException e)
    15.       {
    16.             System.out.println(e);         
    17.       }
    18.  
    Zuletzt bearbeitet: 17. Oktober 2005
  8. Thomas Darimont

    Thomas Darimont Administrator

    Hallo!

    Aber du wolltest doch ein RandomAccessFile haben oder?

    Gruß Tom
  9. Atlanx

    Atlanx Grünschnabel

    Hallo.

    Nicht unbedingt. Da es ja mit RandomAccessFile nicht geht und es aber mit einem BufferedStream funktioniert ist mir das eigentlch egal, wie ich die Daten aus der Datei bekomme. Hauptsache es funktioniert.

    Jetzt müsste ich nur noch die Daten in das File zurückschreiben können.
    Das funktioniert nämlich anscheinend nicht so einfach.

    Irgendwelche Vorschläge?
  10. Atlanx

    Atlanx Grünschnabel

    Wollte nur noch abschliessend anmerken:

    Hab es aufgegeben, zu versuchen etwas in das File im JAR zu schreiben.
    Das geht nämlich schlich und einfach nicht, da es sich bei einem JAR ja um
    ein gepacktes Format handelt, dass als ein Filestream gespeichert ist.
    Und somit ist es auch nicht möglich etwas an eine Datei anzuhängen(etwas in
    eine Datei zu schreiben), die sich in einem JAR befindet.

    Mfg Atlanx.

Diese Seite empfehlen