# *.jar erstellen



## M4x0r (25. Jul 2009)

Hallo, ich habe das Quaxli tutorial durchgearbeitet und möchte nun gerne eine *.jar datei daraus erstellen (auch weil ich das noch nie gemacht habe  )
das funktioniert auch soweit. wenn ich das programm aber nun starte und die enter-taste drücke, mit der das spiel eigentlich starten soll, passiert rein garnichts.
Meine Vorgehensweise:
ich gehe in Eclipse auf File -> Export
Dann wähle ich Java -> Jar File ->NEXT
Jetzt aktiviere ich im src-Ordner "default-package"; ich lege den ort fest wo das jar erstellt werden soll. ->NEXT
Hier aktiviere ich garnichts. ->NEXT
Ich aktiviere bei "Seal some packages" das default package; als Main-Class wähle ich das Game-Panel. ->FINISH

durch google habe ich herausgefunden dass es vielleicht an den "externen bibliotheken" liegen kann? ich vermute mal dass damit die importe gemeint sind.
wie kann ich diese nun einbinden damit alles läuft? oder kann ich einen pfad zu diesen setzen?

Danke für die Hilfe.


----------



## Illuvatar (25. Jul 2009)

Das heißt ermutlich, dass irgendeine Exception geworfen wird. Um den Fehler beheben zu können müsste man am besten mal wissen, was für eine 

Starte die jar mal über die Kommandozeile mit [c]java -jar (Dateiname).jar[/c], dann siehst du die Fehlerausgabe.


----------



## M4x0r (25. Jul 2009)

ah! 
sehr gut :toll:


```
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: input == null!
        at javax.imageio.ImageIO.read(ImageIO.java:1362)
        at GamePanel.loadPics(GamePanel.java:243)
        at GamePanel.doInitializations(GamePanel.java:78)
        at GamePanel.keyPressed(GamePanel.java:325)
        at java.awt.Component.processKeyEvent(Component.java:6092)
        at java.awt.Component.processEvent(Component.java:5911)
        at java.awt.Container.processEvent(Container.java:2023)
        at java.awt.Window.processEvent(Window.java:1816)
        at java.awt.Component.dispatchEventImpl(Component.java:4501)
        at java.awt.Container.dispatchEventImpl(Container.java:2081)
        at java.awt.Window.dispatchEventImpl(Window.java:2458)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
        at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:70
4)
        at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java
:969)
        at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java
:841)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:668)
        at java.awt.Component.dispatchEventImpl(Component.java:4373)
        at java.awt.Container.dispatchEventImpl(Container.java:2081)
        at java.awt.Window.dispatchEventImpl(Window.java:2458)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```

das heisst wohl dass er die bilder nicht mehr findet. 
was wahrscheinlich auch logisch ist , wenn ich so drüber nachdenke, weil ich die bilder ja im bin ordner abgelegt habe und eclipse ja beim erstellen einer jar datei den source und nicht die *.class dateien benutzt, richtig?
d.h. wo muss ich nun die bilder platzieren damit das funktioniert?
in meinem source hab ich das immer so benutzt: 

```
BufferedImage[] clouds = this.loadPics("pics/cloud.gif", 1);
```
pics war der ordner im bin-verzeichnis
Dankeschön


----------



## Illuvatar (25. Jul 2009)

Ich muss zugeben, ich hab Quaxlis Tutorial noch nie gelesen und weiß deshalb nicht was die loadPics-Methode genau macht. Es sieht aber aus, als würde es die ImageIO.read(File) - Methode verwenden.

Was du vermutlich machen willst, ist die Bilder mit in die .jar-Datei zu packen.

Um die Bilder mit Eclipse da rein zu kriegen, musst du zuerst die Bilder als Resourcen mit in dein Projekt importieren. In dem Export-Dialog gibt es dann glaub ich Optionen, solche Resourcen mit zu packen
Ich bin sowieso kein großer Fan von dem Jar-Export in Eclipse - ich mach das eigentlich immer in der Kommandozeile (bzw. mit einer Batch-Datei), da weiß ich dann genau was passiert. Dazu gibts was in den FAQ
Im Programm kannst du die Bilder dann natürlich nicht mehr aus Dateien laden, sondern musst sie aus dem jar holen. Mit 
	
	
	
	





```
getClass().getClassLoader().getResourceAsStream(String)
```
 kriegst du eine Datei aus dem jar als InputStream. Einen InputStream kann dann wieder die ImageIO-Klasse verarbeiten (ImageIO.read(InputStream) )


----------



## Developer_X (25. Jul 2009)

wenn du probleme damit hast, du kannst auch die Dateien und ressource librarys, alle in einen Zip packen, die entsprechende Manifestdatei schreiben, usw...
und dann das ganze in ".jar" abspeichern.

Mir wurde einst gesagt ".zip" und ".jar" seien äquivalent.


----------



## Apo (25. Jul 2009)

Also ich nutze immer die Eclipse Erweiterung FatJar zur Erstellung einer Jar aus Eclipse heraus. Da kann man sehr leicht einstellen, was man wie drin haben will. Ich bin damit mehr als zufrieden.


----------



## M4x0r (25. Jul 2009)

dankeschön 

trotzdem immernoch das problem dass er die bilder anscheinend nicht findet.
die loadPics methode sieht so aus:
	
	
	
	





```
private BufferedImage[] loadPics(String path, int pics) {

		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;

		URL pic_url = getClass().getClassLoader().getResource(path);

		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {
		}

		for (int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x * source.getWidth() / pics, 0,
					source.getWidth() / pics, source.getHeight());
		}
		return anim;
	}
```

aber wie muss ich das jetzt mit dem 
	
	
	
	





```
getClass().getClassLoader().getResourceAsStream(String)
```
 machen? :bahnhof:
Sry, ich blick da nicht ganz durch.
Das mit FatJar hab ich auch mal probiert. aber das weiss ja auch nicht wo diese Bilder liegen oder :noe:


----------



## Illuvatar (25. Jul 2009)

Kleines Beispiel, hilft vielleicht am meisten:

```
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import javax.imageio.*;

public class Example
{
  public static void main(String[] args)
  throws IOException
  {
    new Example().showImage();
  }
  
  public void showImage()
  throws IOException
  {
    InputStream imageStream = getClass().getResourceAsStream("LGIM0010.jpg");
    BufferedImage img = ImageIO.read(imageStream);
    imageStream.close();
    
    JFrame testFrame = new JFrame("Image");
    JLabel label = new JLabel(new ImageIcon(img));
    testFrame.add(label);
    testFrame.pack();
    testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    testFrame.setVisible(true);
  }
}
```

Dazu eine Manifest-Datei:

```
Main-Class: Example
(Leerzeile)
```
und die jar erstellen:

```
D:\jdk6\bin\jar cfm Example.jar manifest.txt Example.class LGIM0010.jpg
```


----------



## L-ectron-X (25. Jul 2009)

In der FAQ gibts zum Thema _Jar erzeugen_ ausführliche Beiträge


----------



## M4x0r (26. Jul 2009)

danke für eure tips leute,
aber ich brings immernoch nicht hin. 

folgende dateien / ordner brauche ich in der jar


```
Cloud.class
Drawable.class
Explosion.class
GamePanel.class
Goodie.class
Heli.class
Manifest.txt
Movable.class
pics
Rocket.class
sound
SoundLib.class
Sprite.class
```

Das liegt alles in einem Ordner. ich bin nun per cmd in diesen ordner gegangen und habe folgendes eingetippt:


```
jar -cfv test.jar Gamepanel.class
 Cloud.class Drawable.class Explosion.class Goodie.class Heli.class Movable.class Rocket.class Sound
Lib.class Sprite.class pics sound
```
mitsamt einer leerzeile am ende.
auch habe ich den Code der loadPics Methode folgendermaßen abgeändert:


```
private BufferedImage[] loadPics(String path, int pics) {

		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;

		

		try {
			source = ImageIO.read(getClass().getClassLoader().getResourceAsStream(path));
		} catch (IOException e) {
		}

		for (int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x * source.getWidth() / pics, 0,
					source.getWidth() / pics, source.getHeight());
		}
		return anim;
	}
```

die jar wird erfolgreich erstellt nur bei doppelklick passiert nichts außer dass ein dumpfer ton erklingt...
langsam weiss ich auch nicht weiter.


----------



## L-ectron-X (27. Jul 2009)

Exceptions sollten wenigstens mit [c]printStackTrace()[/c] behandelt werden.
Starte dein Jar mal mit [c]java -jar test.jar[/c], dann sollte dir möglicherweise ein Fehler auf der Konsole ausgegeben werden.


----------



## leibimatZe (27. Jul 2009)

ich hatte neulich auf arbeit n kleines tool geschrieben und dann einfach die 3 bilder ins .jar verzeichnis gezogen (wie mit.zip) dann liefs wunderbar 
musst halt mit pfadangabe schaun was du angibst genau ob absolut oder nicht, eigtl solltest du wenn se im /bin liegen nur den dateinamen angeben dann kannst so wie ich sagte nachm erstellen der .jar über eclipse die bilder einfach per drag & drop reinziehn, is optisch net so toll aber sollte erstmal funktionieren.

grüße


----------



## M4x0r (27. Jul 2009)

hi,
leider schlug alles fehl.
Dennoch habe ich das ganze mal als ein BlueJ-Projekt erstellt. 
Project -> Create JAR file -> Main Klasse wählen FERTIG ! und funktioniert einwandfrei 
trotzdem danke an alle


----------

