# Jar erstellen mit eclipse



## Kin (14. Jan 2009)

Bekomme leider beim Versuch mein Projekt in eine jar-datei zu exportieren:

Exported with complie warnigns: /Memory/src/de/Game.java
Resource '/Memory' does not exits.
Resource is out of sinc with the fiel system: '/Memory/graphics/card.jpg

Vielleicht kann mir ja jemand helfen. Verstehe nicht mal die Fehlermeldung


----------



## Wildcard (14. Jan 2009)

Du hast eine Datei des Workspaces von ausserhalb Eclipse verändert und nun beschwert sich Eclipse das es darüber nicht informiert wurde.
Klick das Projekt im Navigator/Project Explorer/Package Explorer an und drück F5 für einen Refresh.


----------



## Kin (14. Jan 2009)

ok. danke
das hat schonmal viel gebracht. er erstellt die datei nun , sagt aber er hat eine warnung:
unter den details steht nur
warning......
die Klasse Game ist offensichtilich betroffen.
Die Datei startet leider nicht.


----------



## musiKk (15. Jan 2009)

Ein Warning-Dialog am Ende des Erstellens eines Jar weist eigentlich i.d.R. auf ganz normale Warnings im Code hin.

Das Refresh-Problem kann man auch "umgehen", wenn man unter Preferences - General - Workspace die Option Refresh automatically aktiviert. Man sollte aber dennoch wissen, was man tut. Eclipse sollte imho schon die Herrschaft über den Projektordner haben.

Warum dein Programm nicht startet, kann dir jetzt wohl niemand sagen. Das werden wohl Probleme im Code sein.


----------



## Wildcard (15. Jan 2009)

Jar von der Konsole starten, Ausgabe posten.


----------



## Kin (18. Jan 2009)

Das Problem habe ich "gelöst". Ich lade Bilder und irgendwie findet er die in der jar nicht, d.h ich muss in das Verzeichnis wo die jar drin liegt, die Ordner mit den Images nochmal reinkopieren. Wieso ist das so? habe eigentlich versucht die Pfade relativ zum Projektpfad anzugeben. Irgendwie findet er da die Bilder nicht. 
Noch ein Problem: Unter Linux(Ubuntu) findet er die Images nichtmal, wenn ich sie zusätzlich, wie oben beschrieben extra reinkopiere.
Ich benutze vom Prinzip her folgenden quellcode zum Laden eines Images:


```
File file = new File("graphics"+File.separator+"img1.jpg");
BufferedImage img = new BufferedImage();
img = ImageIO.read(file);
```


----------



## musiKk (18. Jan 2009)

Das geht über Class.getResource() oder Class.getResourceAsStream(). Was man halt braucht. Für mehr Fragen dazu kannst du auch hier im Forum schauen, die Frage wird ständig gestellt (eigentlich auch ein FAQ-Kandidat).


----------



## Kin (18. Jan 2009)

Dann sorry für die doofe Frage. ich werds mal versuchen. Wenns nicht klappt kann ich mich ja nochmal melden bzw. die Suchfunktion des Forums bemühen


----------



## Kin (18. Jan 2009)

Hab folgendes probiert: Bekomme allerdings eine IllegalArgumentException

```
BufferedImage img;
URL url = ClassLoader.getSystemResource("graphics"+File.separator+"img.jpg");
img = ImageIO.read(url);
```
Verstehe gar nicht, wieso er das erst zur Runtime merkt. der Compiler überprüft doch auf Typkonsistenz.


----------



## Wildcard (18. Jan 2009)

Wahrscheinlich ein Windows System? Der separator in einer URL ist immer '/', nicht '\'. Statt dem File.separator also '/'. 
File.separator würde ich in einem Java Programm gar nicht verwenden, da java.io.File immer auch mit / funktioniert. Den separator char brauchst du dann erst, wenn du dem User einen Pfad in ihm vertrauter Syntax präsentieren willst.


----------



## Kin (18. Jan 2009)

habe File-separator durch / ersetzt, die Fehlermeldung bleibt.
dachte  sowieso immer, dass File.separator die bessere Lösung ist, weil dann halt immer der Betriebssystem-Abhängige Fileseparator verwendet wird.


----------



## musiKk (18. Jan 2009)

Ja, aber bei dem String, den man getSystemResource() übergibt, handelt es sich nicht um einen Pfad (siehe Dokumentation).
Zur Typkonsistenz: String erwartet, String erhalten, Compiler glücklich. Alle weiteren Fehler dann zur Laufzeit.

In deinem Beispiel muss das Verzeichnis "graphics" im Root des Jars sein. Also nicht in irgendwelchen src- oder sonstwas-Verzeichnissen, sondern ganz oben. Vielleicht stimmt da nochwas nicht.


----------



## Wildcard (18. Jan 2009)

musiKk hat gesagt.:
			
		

> In deinem Beispiel muss das Verzeichnis "graphics" im Root des Jars sein. Also nicht in irgendwelchen src- oder sonstwas-Verzeichnissen, sondern ganz oben. Vielleicht stimmt da nochwas nicht.


Das src Verzeichnis wird doch nicht ins jar exportiert, bzgw. ist dafür irrelevant. Der übergegbene "Pfad" muss einfach dem Package Namen + Resource entsprechen.


----------



## Kin (18. Jan 2009)

die fehlermeldung stammt direkt aus eclipse. der ordner "graphics liegt direkt im Projektverzeichnis, sonst nirgends, also auf oberster ebene.


----------



## musiKk (18. Jan 2009)

Wildcard hat gesagt.:
			
		

> Das src Verzeichnis wird doch nicht ins jar exportiert, bzgw. ist dafür irrelevant.


Ich habe keine Ahnung, wie die vorliegende Dateistruktur aussieht, da erwähne ich auch mal ein paar Eventualitäten...


----------



## Kin (18. Jan 2009)

Hier nochmal was zur Verzeichnis-Struktur:

Klassen: Projekt->bin->de->Klasse.class
graphics: Projekt->graphics


----------



## Wildcard (18. Jan 2009)

graphics muss in den Build Path, sonst kannst du es nicht über den Classloader laden.
Also entweder in src, oder zB den source folder splitten in src/java und src/resources


----------



## Kin (18. Jan 2009)

habe den ordner graphics in den ordner src kopiert, der Fehler bleibt. 
Nur damit es keine Verständnisprobleme gibt: zur Zeit starte ich das Programm noch direkt aus eclipse ehraus, es ist also noch nicht in .jar umgewandelt. Das brauche ich ja auch sicher nicht machen, wenn es in eclipse schon nicht funktioniert.

edit: Wenn ich graphics in bin kopiere gehts. Habe graphics jetzt mal in src UND bin kopiert. Wenn ich jetzt daraus eine .jar mache, so startet diese wieder nicht, ich denke mal, weil er die Bilder wieder nicht laden kann, also der Fehler vom Anfang


----------



## Wildcard (18. Jan 2009)

Hast du denn inzwischen wie von musiKk beschrieben Classloader.getSystemResouce durch Class.getResource() oder Class.getResourceAsStream() ersetzt? Dann sollte der Fehler zumindest ein anderer sein.


----------



## Kin (18. Jan 2009)

Class.getResource(path) kann ich nicht compilieren:

"Infer Generic Type Arguments..."
"Add @SupressWarnings..."


----------



## Wildcard (18. Jan 2009)

getClass().getResouce


----------



## Kin (18. Jan 2009)

getClass().getResource(String path) get nicht:
IllegalArgumentException


----------



## Wildcard (18. Jan 2009)

Gib die URL mal aus bevor du sie an ImageIO verfütterst.


----------



## Kin (18. Jan 2009)

url = getClass().getResource(path)
System.out.println(url);

gibt "null" aus.


----------



## Wildcard (18. Jan 2009)

Dann passt der Pfad so noch nicht.


----------



## Kin (18. Jan 2009)

Wieso passt der Pfad dann noch nicht? Mit dem anderen Befehl lädt er die Datei ja ordnungsgemäß, nur leider als .jar exportiert nicht mehr.
Das kann doch nicht so schwer sein. Gibts denn da keine Standardlösung?


----------



## musiKk (18. Jan 2009)

Das ist die Standardlösung.


----------



## Wildcard (18. Jan 2009)

Kin hat gesagt.:
			
		

> Gibts denn da keine Standardlösung?


Doch. Full Qualified Name, also "/"+ Package Name +  "/" + Resouce
Bei Package Name ist '/' der Separtor. In deinem fall also (wenn ich deine Struktur richtig verstanden habe) 

```
/graphics/bild.gif
```


----------



## Kin (18. Jan 2009)

ich checks einfach nicht. mach ich das nich so?

```
URL url = getClass().getResource("/graphics/img.jpg");
img = ImageIO.read(url);
```

graphics ist ein Ordner direkt im Projektverzeichnis. So wie ich es oben schreibe geht es aber nicht. In eclipse läd er die Datei aber nicht wenn ichs in jar exportiere. Was hab ich denn nun falsch gemacht?


----------



## musiKk (18. Jan 2009)

Mach mal die Jar-Datei mit dem zip-kompatiblen Packprogramm deiner Wahl auf und überzeuge dich von dieser Struktur. Ich habe es spaßeshalber auch nochmal ausprobiert und das geht genau so, wie hier beschrieben.


----------



## Kin (18. Jan 2009)

Das habe ich schon gemacht. in der jar-Datei befindet sich der ordner de mit den class-Datein und ein ordner graphics mit den Grafiken, ausserdem hab ich sicherheitshalber in den de-Ordner den graphics-Ordner auch nochmal reinkopiert.


----------



## musiKk (18. Jan 2009)

Naja, dann hier mal mein Beispiel. Vergleichs mal, ich weiß da nicht weiter.


----------



## Kin (18. Jan 2009)

ich war so dämlich und habe vergessen, dass ich an mehr als an einer Stelle im Quellcode Bilder lade ((
Grundsätzlich funktioniert es aber er lädt nicht alle Bilder. Ich lade wie gesagt an verschiedenen Stellen im Code Bilder. Am Anfang gehts, später nicht mehr.


----------

