# Exportiertes JAR startet nicht



## _Zoidberg_ (17. Mrz 2008)

Sers Leute,

hab folgendes Problem: hab ein relativ großes Projekt mit Datenbank-Treibern, das ich gern als jar exportieren würde. Habs erst mit der normalen Export-Funktion von Eclipse versucht und hab dann ein jar-File bekommen, das sich nicht öffnen lässt. Keine Fehlermeldung, es öffnet sich einfach nur nix.

Dann hab ich ein bissel recherchiert und habs dann mit dem fat-jar zu exportieren versucht, weil ich ich ja meine DB-Treiber auch im jar brauch. Nur kam ich dann auf genau dasselbe Ergebnis.

Such jetzt schon seit einiger Zeit und spür schon langsam den Frust.  

Kann mir jemand von euch da helfen?

Danke im Voraus
Zoidberg


----------



## Guest (17. Mrz 2008)

Du musst beim Exportieren die Klasse deines Hauptprogramms (die Klasse mit main) angeben, 
damit es in die Manifest-Datei eingetragen wird.


----------



## _Zoidberg_ (17. Mrz 2008)

Jo, hab ich gemacht. Geht aber trotzdem nicht. Ich habs zuerst ja auch mit dem normalen jar-Export von Eclipse probiert, da hat sich das jar dann aber nicht starten lassen.

Dann hab ich das fatjar-Plugin installiert und damit probiert, da kommt genau dasselbe raus.


----------



## Guest (17. Mrz 2008)

Was für Fehlermeldung kommt, wenn du es im DOS-Fenster mit

java -jar archiv.jar 

aufrufst?


----------



## _Zoidberg_ (17. Mrz 2008)

Gar keine, es tut sich nur nichts. Also genauso, als ob ich das jar per Doppelklick öffnen würde.


----------



## Guest (17. Mrz 2008)

Was steht in der Manifest-Datei des exportierten Archivs?


----------



## _Zoidberg_ (17. Mrz 2008)

Manifest-Version: 1.0
Main-Class: grafik.GUI


----------



## semi (18. Mrz 2008)

Funktioniert das hier? testwindow.jar
Es sollte ein simples Fenster aufgehen.

Und wenn du deine Anwendung mit

java -cp .;archiv.jar; grafik.GUI

aufrufst, dann funktioniert es?
Du hast auch nicht zufällig so 'ne Perle im Code, die Fehler verwirft?
	
	
	
	





```
catch(Exception e) {
   // who cares
}
```
oder gar die Version für Optimisten
	
	
	
	





```
catch(Throwable e) {
   // kommt nie vor
}
```
:wink:


----------



## Giftstachel (19. Mrz 2008)

hatte ich auch mal... prüf mal, ob er auch mit sicherheit die verbindung zur DB aufbaut. macht er das nicht, und ist man ein wenig faul, und spart sich die fehlerausgabe im GUI, dann kann das durchaus passieren, das er sich nicht starten lässt, weil er die exception ja im hintergrung wirft, aber nicht anzeigt. (tip: nutze nen popup-messenger der ist am einfachsten ins gui einzubauen).
vor allem passiert das ganz gerne in netzwerken, in denen firewalls (sollte ja zumindest so sein) herumspuken


----------



## _Zoidberg_ (19. Mrz 2008)

Das testwindow.jar funktioniert. Was Exceptions und die Verbindung zur DB angeht: Ich hab ja schon ein fertiges Applet, das ich x-mal getestet hab. Von daher sollte es also keine Probleme geben.

Andere Frage: Was ist so schlimm an einem catch mit einer gewöhnlichen Exception? Ich schreib zwar möglichst genau die Exception hin, die auch geworfen wird, nur hab ich manchmal halt doch nur 
	
	
	
	





```
catch (Exception e)
```
 stehen....


----------



## Guest (19. Mrz 2008)

Tja, so kann man sich irren. Hab mal den Befehl eingegeben und das cmd sagt mir, dass er eine NullPointerException bei einem ImageIcon hat. Find ich zwar merkwürdig, weil ich das Bild imho mit exportiert habe, aber ich schau mir das mal genauer an.


----------



## semi (19. Mrz 2008)

OK, wenn das Ding gelaufen ist, dann liegt es nicht an fehlerhaften/fehlenden Einträgen in der Registry (Jar mit JVM 
ausführen etc.). OK.. Applet? Verwende getImage(getResource("icon.gif"))

Das mit dem catch(Exception) war so gemeint, dass diese abgefangen wird, aber der Catch-Block leer ist. Das ist 
ziemlich lustig bei der Fehlersuche.


----------



## _Zoidberg_ (19. Mrz 2008)

Also...in der main-Methode hab ich jetzt folgendes stehen:


```
public static void main(String[] args)
	{
		GUI gui = new GUI();
		gui.init();
		System.out.println("Test");
	}
```

Ich versteh zwar nicht ganz, warum ich beim JAR-Export eines Applets eine main-Methode brauch, aber ohne gibt er mir eine Fehlermeldung. 
Wie auch immer, jedenfalls wird jetzt genau dasselbe ausgegeben, als ob ich von Eclipse aus starten würde (um genau zu sein, ein paar Kontrollbefehle über den Datenbankaufbau). Trotzdem öffnet sich kein Fenster. Irgendeine Idee? :?  

Aja, sry für den Dreifachpost. :wink:


----------



## _Zoidberg_ (19. Mrz 2008)

Hm...

```
try
		{
			JLabel label = new JLabel(getImage(getResource("LogoGroß300.gif")));
			logoPanel.add(label);
		}
```

Da sagt er mir, dass die Methode getResource für meine Klasse GUI (das is die Appletklasse) nicht definiert ist. Muss ich da irgendwas importieren?


----------



## semi (19. Mrz 2008)

Ätsch, sorry, getClass().getResource("wasauchimmer.gif") war gemeint.

Suche hier nach "Applet signieren", dann weisst du mehr, warum du keinen Zugriff auf die Datenbank bekommst.


----------



## _Zoidberg_ (19. Mrz 2008)

Gleich vorweg: Bitte nicht übel nehmen, dass ich hier alles vollspamme. Hab mich erst jetzt registriert und werd in Zukunft auch brav die Edit-Funktion nutzen.

Ich hab jetzt


```
try
		{
			JLabel label = new JLabel();
			label.setIcon(new ImageIcon(getToolkit().getImage("LogoGroß300.gif")));
			
			logoPanel.add(label);
		}
```

stehen. In Eclipse läufts genauso wie vorher, im cmd krieg ich jetzt keine NullPointerException mehr. Nur die Text-Ausgabe, die immer kommt, wenn ich das Programm starte. Aber Fenster öffnet sich wieder keines.

[Edit] So, hab jetzt nochmal alle Exceptions durchgecheckt, bei zweien gabs ein Problem. Hab ich ausgebessert und nochmal nachgeschaut, ob eh überall was ausgegeben wird im catch-Block. Exception werden jetzt auch keine mehr ausgegeben im cmd, also sollts ja eigentlich gehen. :? 

Muss man vl. noch irgendeine Methode aufrufen, so in die Richtung start() oder so was? Ich bin langsam echt am Verzweifeln, in Eclipse läufts doch...

Ich hab auch am Ende der init-Methode noch ein println, das wird in der Konsole auch ausgegeben. Da sollte der Fehler eher nicht liegen.


----------



## _Zoidberg_ (20. Mrz 2008)

Sry Semi, hab deinen Beitrag nicht gesehen.

Habs jetzt so gemacht, wie du gesagt hast, krieg aber (in Eclipse und in cmd) eine NullPointerException.
Der Pfad ist imho richtig angegeben, habs mit dem kompletten (C:\...) probiert und auch das Bild direkt in den Projektordner gestellt und nur mit dem Filenamen angesprochen, was vorher auch funktioniert hat.

Und Zugriff auf die DB hab ich ja, daran liegts nicht.

[Edit] Hab grad den Thread hier (http://www.tutorials.de/forum/java/213711-jar-file-startet-nicht.html)gefunden, wobei ich nicht sicher bin, ob in dem Post am Ende vl. die Lösung für mein Problem ist. Ich hab dann den cmd-Befehl eingegeben, der auf dieser Seite (http://fjep.sourceforge.net/fjepfaq.html) angeführt wird, die Ausgabe war die selbe wie mit einem normalen "java -jar ......"-Befehl.
Bin mir jetzt nicht ganz sicher, was ich da machen muss, damit ich diese SWT-DLL dann hab. Kann mir da jemand weiterhelfen?


----------



## semi (20. Mrz 2008)

Datenbank, Jar-Datei, Applet, jetzt wieder noch SWT-DLLs. :bahnhof: Was ist es letztendlich? Ein Applet oder 
eine "normale" Anwendung? Ist die GUI in SWT geschrieben? Eher nicht, da du irgendwas mit einem JLabel 
versuchst. Sorry, ich verstehe langsam nicht, worum es dir geht. 
Das sind ziemlich viele Sachen, wo etwas schief gehen kann. Eins steht fest, SWT kannst du in Applets nicht 
verwenden. Du schreibst was von einer NullPointerException. Ich nehme an, dass das getClass().getRessource("...") 
null liefert und getImage scheitert.  Wie sind die Pfade innerhalb der Jar-Datei? Wo sind die Bilder, wo der Rest?
Denk immer daran, dass man hier nicht über deine Schulter schauen kann.


----------



## _Zoidberg_ (20. Mrz 2008)

Sry, bin wohl etwas chaotisch. Prinzipiell gehts mir darum, aus einem (fast, vl. kommen ein paar Features dazu) fertigen Applet ein lauffähiges jar-File zu erstellen.
Fertig heißt in dem Fall, dass es in Eclipse ohne Probleme läuft.

Also der Reihe nach. Und ein großes Dankeschön an alle, die es sich antun, mir zu helfen.  

Die beiden Bilder, die ich verwende, liegen im Ordner "images", den ich mir innerhalb meines Projekts in Eclipse erstellt hab.

1. Applet oder Anwendung - Ich hab zuerst ein Programm, das unter anderem auf eine Datenbank (xampp) zugreift, als JFrame geschrieben. Das hat funktioniert, wenn ich es von Eclipse aus gestartet hab. Ein JAR-Export hab ich damit nicht versucht.

Dann hab ich das JFrame in ein Applet umgewandelt, wieder von Eclipse aus gestartet - hat funktioniert. Da hab ich angenommen, das da alles passt, und wollte es als JAR exportieren.

2. JAR-Export per Eclipse-Funktion - Zuerst hab ich versucht, das Projekt (als Applet!) mit der normalen Exportfunktion von Eclipse zu exportieren. Das jar hat sich dann aber per Doppelklick nicht öffnen lassen.
Also hab mal ein bisschen gesucht und rausgefunden, dass bei jar-Files im Projekt das Projekt nicht einfach so exportiert werden kann. Das ist bei mir der Fall, ich hab ja einen Datenbank-Treiber bei mir im Projekt liegen.

Deshalb hab ich mir das fatjar-Plugin runtergeladen und installiert, das sowas kann.

3. JAR-Export per fatjar - Dann eben der Export per fatjar. Das Ergebnis war mehr oder weniger dasselbe; das jar hat sich (per Doppelklick) nicht öffnen lassen bzw. hat sich kein Fenster geöffnet.

4. Öffnen des jar-Files via Konsole - Da hab ich ungefähr den Thread hier aufgemacht. Und das jar mit den Befehlen geöffnet, die ich von hier habe (java -cp .; .... -> thx, semi). Da hab ich dann Exceptions gefunden, die mit zwei Images zu tun hatten, die ich im Programm verwende (welche Exceptions genau, weiß ich nicht mehr).

5. Exception beim Öffnen/Einfügen der Bilder - Darum hab ich nach einem anderen Weg gesucht, die Bilder einzufügen. Ich habs auch so probiert, wie du mir empfohlen hast (getClass().getResource()....), aber das hat bei mir nicht funktioniert - NullPointerException wurde geworfen, obwohl der Dateipfad gestimmt hat.
Eine andere Möglichkeit habe ich gefunden -


```
label.setIcon(new ImageIcon(getToolkit().getImage("hier der absolute dateipfad")));
```

Die hat funktioniert, wenn ich von Eclipse aus gestartet habe. Und beim exportierten jar sind in der Konsole keine Fehlermeldungen mehr gekommen. Zur Kontrolle hab ich am Ende von init() noch ein println() geschrieben, das wird in der Konsole ausgegeben. Von daher habe ich angenommen, dass nicht irgendwelche Exceptions der Fehler sind.

6. Die DLL-Sache - Nachdem ich keine Ahnung hatte, wo der Fehler liegt, hab ich wieder mal gegoogelt und dabei einen Thread gefunden (mit einem ähnlichen Thema), wo jemand hierauf verlinkt hat: http://fjep.sourceforge.net/fjepfaq.html

Das FAQ von fatjar. Und ich hab das SWT irgendwie überlesen, weil die Problembeschreibung so schön vertraut geklungen hat.  

Nachdem ich aber kein SWT benutze (vermute ich zumindest, ich habe diverse Pakete java.awt.x und java.swing.x importiert), ist das vermutlich eh sinnlos.

Und was die Datenbank angeht: Mit der hatte ich eigentlich nie ein Problem - Das war wohl nur ein Missverständnis.


Und nochmals Danke an alle, die mir helfen. Ich weiß, ich bin mühsam :wink:


----------



## semi (20. Mrz 2008)

Puhh, lass mich mal nachdenken. 



			
				_Zoidberg_ hat gesagt.:
			
		

> Die beiden Bilder, die ich verwende, liegen im Ordner "images", den ich mir innerhalb meines Projekts in Eclipse erstellt hab.


Klingt gut. 

Betrachte mal folgenden Verzeichnisbaum bzw. Projektbaum.






Es gibt darin ein Sourcecode-Verzeichnis "src". Darin ist ein Package "examples.applets", wo die Klasse ImageViewer
enthalten ist. Im gleichen Package ist ein Package/Verzeichnis "pictures", welches eine Bilddatei enthält.

Ein anderes Bildverzeichnis "images" ist auf gleicher Ebene wie das "src"-Verzeichnis und ist ebenfalls 
ein Source-Verzeichnis. Im "bin"-Verzeichnis siehst du wohin die Dateien compiliert bzw. kopiert werden.

So kannst du das "images" Verzeichnis als Source-Verzeichnis einstellen. Bei dem Verzeichnis "pictures" brauchst du
es nicht extra einzustellen, da es beireits in einem Source-Verzeichnis liegt.






Um an die URL der Bilder ran zu kommen musst du *relativen* Pfad verwenden. Denk dir einfach alles, was
ausserhalb der Source-Verzeichnisse liegt, weg. Es existiert für dein Programm nicht.
Verwende auch nie feste Pfade wie c:\wo\auch\immer\cooles-bild.jpg 

Hier paar Beispiele für den Zugriff auf Ressourcen.
	
	
	
	





```
package examples.applets;

public class ImageViewer
{
   public static void main(String[] args)
   {
      // Das ist der Pfad, in dem sich die aktuelle Klasse befindet
      System.out.println(ImageViewer.class.getResource("."));
      
      // Das hier ist falsch. Im Package der Klasse ImageViewer gibt es die Datei nicht
      System.out.println(ImageViewer.class.getResource("folder.gif"));
      
      // Das hier ist korrekt. Es ist im "Root-Verzeichnis" der Anwendung, also im Verzeichnis "images"
      System.out.println(ImageViewer.class.getResource("/folder.gif"));
      
      // Das hier ist korrekt. Immer relativ zur aktuellen Klasse betrachten
      System.out.println(ImageViewer.class.getResource("pictures/verzeichnis.gif"));

      // Das hier ist auch korrekt. Relativ zum "Root-Verzeichnis" der Anwendung
      System.out.println(ImageViewer.class.getResource("/examples/applets/pictures/verzeichnis.gif"));
   }
}
```

Wenn du das durch hast, sag Bescheid. Damit dürfte dein Problem mit den Bildern erledigt sein, wenn du es 
nachvollziehen und auf dein Projekt anwenden kannst.


----------



## _Zoidberg_ (21. Mrz 2008)

Gut, images hab ich jetzt als eigenen Source-Ordner auf der gleichen Ebene wie den src, wo die java-Files drin sind.

Der Code, mit dem ich die Bilder aufrufe, sieht so aus:


```
try
{
	label.setIcon(new ImageIcon(getToolkit().getImage(getClass().getResource("/LogoGroß300.gif"))));
}

catch(NullPointerException e)
{ System.out.println("Logo: NullPointerException - " + e); }
```

Läuft in Eclipse, in der Konsole gibts ebenfalls keine Fehlermeldung. Business as usual 

Ideen, wies weitergehen soll?


----------



## semi (21. Mrz 2008)

Was wird es? Eine Art Splash-Bildchen?
Füge das hier in die Manifest.mf Datei ein, dann brauchst du das ganze nicht extra anzuzeigen. (JRE 1.6 vorausgesetzt)

SplashScreen-Image: LogoGroß300.gif


----------



## _Zoidberg_ (21. Mrz 2008)

Nein, das ist ein Logo, das die ganze Zeit über in der Ecke angezeigt wird. Aber thx für den Tipp.

Gibts vielleicht bei Applets irgendetwas besonderes zu beachten, wenn man ein jar erstellt? 
Z.B. braucht man ja für ein Applet ja eigentlich kein main, fürs jar-Erstellen aber anscheinend schon.

In meinem main steht jetzt das:


```
public static void main(String[] args)
{
	GUI gui = new GUI();
	gui.init();
	
	gui.setVisible(true);
	gui.start();
	
	System.out.println("Test");
	//gui.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
```

GUI ist die Applet-Klasse. Muss ich vielleicht noch andere Funktionen aufrufen?


----------



## semi (21. Mrz 2008)

Ein Applet ist kein Frame. Eine main-Funktion braucht es ebenfalls nicht, es sei denn, du möchtest es auch
ausserhalb des Browsers laufen lassen.
Das geht dann z.B. wie folgt (das Applet wird wie eine "normale" Komponente im Frame angezeigt)
	
	
	
	





```
package examples.applets;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JApplet;
import javax.swing.JFrame;

public class ImageViewer extends JApplet
{
   private static final long serialVersionUID = 2282322642678985984L;
   private Image logo;
   
   public ImageViewer()
   {
      super();
   }
   
   @Override
   public void init()
   {
      super.init();
      logo = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/folder.gif"));
   }
   
   @Override
   public void destroy()
   {
      super.destroy();
      // Aufräumarbeiten hierher
   }
   
   @Override
   public void paint(Graphics g)
   {
      super.paint(g);
      if(logo != null)
      {
         // Logo in der rechten oberen Ecke
         g.drawImage(logo, getWidth()-logo.getWidth(this), 0, this);
      }
   }
   
   public static void main(String[] args)
   {
      final ImageViewer imageViewer = new ImageViewer();
      imageViewer.init(); // wird normalerweise vom Browser aufgerufen
      final JFrame frame = new JFrame();
      frame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e)
         {
            frame.setVisible(false);
            imageViewer.destroy(); // wird normalerweise vom Browser aufgerufen
            System.exit(0);
         }
      });
      frame.add(imageViewer); // Das Applet ist auch nur eine Komponente bzw. Container
      frame.setSize(300, 300);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }
}
```
Beachte aber, das du bei der Ausführung über main, kein AppletContext hast.


----------



## _Zoidberg_ (21. Mrz 2008)

DANKE!  

So, das musste mal gesagt werden. Jetzt funktionierts endlich. Nochmal thx, semi. Besonders für deine Geduld. :wink:


----------



## Guest21 (20. Jan 2012)

Hallo Moin, ich denke ich habe hier ein ähnliches Problem.

Ich habe hier mein Programm welches im Compiler rennt wie es lustig ist und es funktioniert alles ohne Probleme. So nun will ich das aber als .jar exportieren was soweit auch alles okay ist. 

Starte ich jetzt die .jar tut sich rein gar nichts. Es wird eine NullPointerException geworfen, warum verstehe ich jedoch nicht. 
Ich habe die Bilder mit exportiert und im Complier lasse ich mir extra noch den Dateipfad angeben um zu wissen ob er wirklich da hin springt.

Von daher stehe ich grad auf dem Schlauch was ich noch machen könnte und würde mich über Hilfe sehr freuen. 



```
URL bildurl = getClass().getResource("ordner/datei.png");
System.out.println(bildurl);
ImageIcon bild = new ImageIcon(bildurl);
screen = new JLabel(bild)
```

So bei ImageIcon sagt er wieder das bildurl wieder leer ist


----------

