Eclipse JAR Bilder ausführbar

Atlanx

Mitglied
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:
Transviewer 
     | 
     | -- doc
     | -- bin
     | -- meta -- manifest.mf
     | -- src
           |
           | -- images 
           | -- de
                  | -- transview 
                             |
                             | -- test2.java
                             | -- helpfile.html
                             | -- trans.ini

Inhalt der manifest.mf
Code:
Manifest-Version: 1.0
Main-Class: de.transview.test2

Die Klasse test2.java enhält alle Methoden und die Mainklasse:
Code:
"Auszug":

package de.transview;

import  java................

public class test2 extends JFrame implements ActionListener { ..


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:
B:class de.transview.test2
A:jar:file:/D:/transview.jar!/images/icon16x16.png
Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at de.transview.MyMenu.<init>(test2.java:2782)
        at de.transview.test2.<init>(test2.java:278)
        at de.transview.test2.main(test2.java:223)

A und B hab ich zur Fehlersuche eingebaut, wobei
B: von
Code:
System.out.println("B:"+ getClass());
A: von
Code:
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:
Ich habs gefunden.

Es funktioniert so, wie ich es beschrieben hab.
Nur hatte sich in einem
Code:
getResource( "/images/icon16x16.png") )
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:
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:
  String inipath = getClass().getResource("/de/transview/trans.ini").toString();
  
  // liefert:  jar:file:/D:/Documents%20and%20Settings/../transview.jar!/..../trans.ini

  File x = new File( inipath );
 
 try {
          RandomAccessFile f = new RandomAccessFile( x , "r");  
....

und
Code:
 System.out.println( (getClass().getResource("/de/transview/trans.ini")).getFile() );
//liefert:  /D:/Documents%20and%20Settings/../transview.jar!/..../trans.ini

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:
Danke für die Links.

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

Code:
 String inipath_in = getClass().getResource("/de/transview/trans.ini").toString();
 File x = new File( inipath_in );
        
  // URL decoden
  // Bug in Java bis mindestens 1.4        	    
  String inipath_use = java.net.URLDecoder.decode( inipath_in );
  System.out.println("|T|"+ inipath_in );
  System.out.println("|L|"+ inipath_use + "\n" );
   
  try {
         RandomAccessFile f = new RandomAccessFile( inipath_use , "r"); 
....
Ausgabe:
Code:
|T|jar:file:/D:/Documents%20and%20Settings/TAMA/My%20Documents/Eclipse_Workspace/Transviewer/bin/de/transview/trans.ini
|L|jar:file:/D:/Documents and Settings/TAMA/My Documents/Eclipse_Workspace/Transviewer/bin/de/transview/trans.ini

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)

Funktionieren tut es halt immer noch nicht (-_-);

MfG Atlanx.
 
Zuletzt bearbeitet:
So gehts:

Code:
URL u = getClass().getResource("/de/transview/trans.ini");
try {
            BufferedReader fileread =
              new BufferedReader(new InputStreamReader( u.openStream() )  );

           String line;
            while( (line = fileread.readLine()) != null ) 
            {
                  System.out.println("out: "+line);
            }  
            fileread.close();
      }
catch (IOException e) 
      {
            System.out.println(e);		    
      }
 
Zuletzt bearbeitet:
Hallo.

Original geschrieben von Thomas Darimont

Aber du wolltest doch ein RandomAccessFile haben oder?

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?
 
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.
 
Zurück