# (Eclipse) Applikation als .jar mit ABHÄNGIGKEITEN exportiere



## public_void_main (27. Jun 2007)

Hallo,

ich habe ein kleines Programm geschrieben, das ich gerne als .jar exportieren moechte. Weil ich mir nicht doppelte Arbeit machen wollte, ist es an ein anderes Projekt gebunden worden, so dass einige Klassen aus diesem in meinem aktuellen Programm benutzt werden. Jetzt ist es aber so, dass genau jene Klassen auch noch auf weitere Libraries aus dem "verlinkten" Projekt zugreifen.

- Gibt es eine elegante Möglichkeit, das in Eclipse automatisch unter Berücksichtigung der Abhängigkeiten exportieren zu lassen? 

- Wofür ist eigentlich die Option "Order and Export" in den Projekteigenschaften/Buildpath gut?

Vielen Dank, 
Georg


----------



## The_S (28. Jun 2007)

Mit Frage 2 hast du Frage 1 schon beantwortet  . Wenn du in Order und Export deine Resourcen mit angibst, werden die gleich mit in dein Jar gepackt!


----------



## public_void_main (28. Jun 2007)

Hallo Hobbit 

Bist Du Dir ganz sicher? Wenn ich aufs Projekt rechts-klicke und von dort "Export" wähle, muss ich ja dennoch einzeln selektieren, welche Verzeichnisse und Dateien ins Jar wandern sollen. Oder wie machst Du das? Wäre ja eine interessante Möglichkeit...

ansonsten habe ich mit dem Fat-Jar-Plugin gute Erfahrung gestern gemacht. Nur ist es nicht soooo schön, wenn man von einem Plugin gewissermaßen abhängig ist.


----------



## The_S (28. Jun 2007)

Ich weiß gar nicht was alle immer mit FatJar wollen ... Eclipse bietet doch eine wunderbare exportierfunktion ???:L . Also ich packe meine  externen Sourcen eigentlich in den selben Ordner wie mein eigentliches Jar und passe dann das Manifest dementsprechend an. Wenn ich aber auf eine Jar mehr oder minder angewiesen bin (J2ME Programmierung) binde ich die entsprechenden Projekte/Jars über Order and Export mit ein.

Rechte Maustaste aufs Projekt => Build-Path => Configure Build-Path => Order and Export => Haken in die entsprechenden Sourcen.

Jetzt werden deine Projekte/Jars beim Exportieren über

Rechte Maustaste aufs Projekt => Export => Jar-File 

ohne Weiteren Einstellungen mit eingebunden.


----------



## public_void_main (28. Jun 2007)

Hallo,

den letzten schritt kann ich so nicht nachvollziehen. In dem Dialog zur funktion Export -> Jar File kommt im naechsten Schritt des Assistenten das Fenster "Jar File Specification". Dort muss ich aber noch manuell die Resourcen, die im Jar inkludiert werden sollen, anwaehlen. UNABHAENGIG davon, was ich in "Order and Export" abgehakt habe, wird in diesem Fenster automatisch nur das aktuelle Projekt abgehakt. Libs, die ich verwende, sind manuell zu selektieren.

Es hoert sich so schoen einfach an, wie Du es oben beschreibst... habe ich vielleicht einfach eine Kleinigkeit uebersehen?
Im beschriebenen Dialog vom Jar-Export habe ich folgende Optionen abgehakt:

[ ] Export generated class files and resources
[X] Export all output folders for checked projects
[X] Export java source files and resources
[ ] Export refactorings for checked projects

---

[ ] Compress
[X] Add directory entries
[X] Overwrite existing files.



==================

Um das Problem zu verdeutlichen, habe ich das eclipse-Project gerade schnell mal hochgeladen: http://ablage.georgstach.de/jartest.zip

Dort ist auch eine MANIFEST.MF enthalten, um eine Library zu finden (hier gwt-user.jar). 
Wenn ich das Projekt als jar exportiere, indem ich das Manifest-File dazu benutze, und dann unterhalb des exportierten jars das die Datei im Verzeichnis lib/gwt-user.jar anlege, sollte es ja eigentlich klappen und die Bibliothek gefunden werden (java -jar jartest.jar). Tut es aber nicht.... das kann ja nicht so schwer sein. Was ist hier also falsch?

Ich hoffe ihr koennt helfen


----------



## The_S (28. Jun 2007)

Hm, gerade selber ausprobiert, da ich in letzter Zeit nur J2ME bzw. .WAR oder .EAR Projekte exportiert habe und tatsächlich, du musst die Resourcen nochmal mit angeben. Ein Klick zusätzlich sollte aber zu verkraften sein oder  ?


----------



## public_void_main (28. Jun 2007)

Jor den Klick kann ich noch verkraften  
Aber dann nutzt mir doch eigentlich die "Order and Export"-Funktion gar nichts, oder sehe ich das falsch?

Ich bin auch noch nicht dahintergestiegen, was an meinem Manifest nicht in Ordnung ist. (Vielleicht ist das der Grund, warum dieses FatJar so beliebt ist ;-)).


----------



## The_S (28. Jun 2007)

Und ich versteh nicht wie mein anhand eines Manifest-Files exportieren kann ... bzw. versteh ich nicht, wo es eine solche Funktion in Eclipse geben soll ???:L .

Generell findest du in den JAR-Beiträgen in den FAQ auch einiges über das Manifest.


----------



## public_void_main (28. Jun 2007)

Hallo Hobbit,

na auch im JAR-Export-Dialog! Das ist doch der eigentliche Sinn der Sache... du kannst doch dein eigenes Manifest-File schreiben, so dass die zusaetzlichen Resourcen gefunden werden (theoretisch, ich frage mich ja immer noch, was an meinem kleinen Projekt falsch ist). 
Dazu einfach in dem o.a. Dialog 2x "Weiter" klicken, und dort gibt es ein eigenes Feld, mit dem man das Manifest angeben kann. 

Oder reden wir gerade irgendwie aneinander vorbei? 
Ich mein', wie machst Du das denn, wenn Du _kein_ Fatjar exportieren moechtest sondern eine ganz normale Anwendung, die noch auf weitere jars angewiesen ist?


----------



## The_S (28. Jun 2007)

Äh, ich glaub du hast da etwas am Manifest falsch verstanden. Ein Manifest wird der Applikation beigelegt und weißt sie darauf hin, wo es weitere Jars mit Klassen findet, welches die main-Klasse ist, ... nicht aber welche Klassen/Projekte/Jars von einer IDE mit in das JAR gepackt werden sollen.


----------



## public_void_main (28. Jun 2007)

Wir reden aneinander vorbei:
In ECLIPSE, genauer gesagt in dessen Export-funktion kannst du das Manifest-File angeben, damit es von dem Jar-Export eingebunden wird, und zwar ins META-INF-Verzeichnis. Im Manifest werden dann abhaengige jars mit eingebunden, in denen nach weiteren Klassen gesucht werden soll, unabhaengig davon ob diese main-Methoden haben oder nicht.

Eine genauere Beschreibung dessen siehe auch hier:
http://mindprod.com/jgloss/jar.html#CLASSPATH

Und nochmal zur obigen Frage, wie exportierst Du dann ein jar? und was nutzt an dieser Stelle die "Order and Export"-Funktion von eclipse?

Ich bin bis jetzt leider kein bisschen schlauer geworden


----------



## The_S (28. Jun 2007)

public_void_main hat gesagt.:
			
		

> Wir reden aneinander vorbei:



Könnte sein ...



			
				public_void_main hat gesagt.:
			
		

> In ECLIPSE, genauer gesagt in dessen Export-funktion kannst du das Manifest-File angeben, damit es von dem Jar-Export eingebunden wird, und zwar ins META-INF-Verzeichnis.



Joa, das bestreitet auch niemand. Und wenn es nicht im Meta-Inf gelegt werden würde, wäre das Manifest ja recht sinnfrei  .



			
				public_void_main hat gesagt.:
			
		

> Im Manifest werden dann abhaengige jars mit eingebunden, in denen nach weiteren Klassen gesucht werden soll, unabhaengig davon ob diese main-Methoden haben oder nicht.



Im Manifest werden Properties für das Jar gesetzt. Z. B. wo sich im Dateisystem (nicht innerhalb des JARs) weitere Bibliotheken befinden, oder welche Klasse beim Starten dieser JAR ausgeführt werden soll.



			
				public_void_main hat gesagt.:
			
		

> Und nochmal zur obigen Frage, wie exportierst Du dann ein jar?



Ich binde nichts mit ein, sondern lasse nur das aktuelle Projekt exportieren. Beim exportieren gebe ich dann ein selbst definiertes Manifest von mir mit, welches die Main-Klasse enthält und auf andere Resourcen außerhalb des JARs verweist. Sollten diese Resourcen schon als JAR vorhanden sein, kopiere ich diese einfach in den im Manifest angegebenen Ordner in das Verzeichnis, wo mein eigentliches "Haupt-Jar" liegt. Wenn die Resourcen noch nicht als JAR vorliegen, generiere ich eben vorher daraus ein Jar. Das Ganze wird dann z. B. als Zip ausgeliefert.



			
				public_void_main hat gesagt.:
			
		

> und was nutzt an dieser Stelle die "Order and Export"-Funktion von eclipse?



Also zumindest beim J2ME Plug-In werden die Order und Export Resourcen mit ins JAR exportiert.


----------



## public_void_main (28. Jun 2007)

Ich glaube, so langsam kommen wir auf einen gruenen Zweig. 



> Joa, das bestreitet auch niemand. Und wenn es nicht im Meta-Inf gelegt werden würde, wäre das Manifest ja recht sinnfrei  .



Ack ;-)
das Manifest, was ich dem Jar-Exporter von Eclipse verfuettere, hat eben noch die Referenzen auf die Main-Class und zu weiteren Resourcen.




> Im Manifest werden Properties für das Jar gesetzt. Z. B. wo sich im Dateisystem (nicht innerhalb des JARs) weitere Bibliotheken befinden, oder welche Klasse beim Starten dieser JAR ausgeführt werden soll.



OK, setzen wir hier mal an.  Auf der Seite http://mindprod.com/jgloss/jar.html#CLASSPATH steht: _n JDK 1.3+ there is an analogous manifest entry to let you control the classpath. It is used to specify optional jars that will be downloaded only if need. Normally you would also place a Jar-index of these files in your main jar to help the loader decide which ones need to be loaded. 
Class-Path: myplace/myjar.jar . myplace/other.jar jardir/
_

Also scheint man doch noch Referenzen auf weitere Resourcen, auch in Form von Jars, mit einbinden zu koennen. Und nichts anderes habe ich ja vor 
Also entweder auf der Seite steht Mist oder ich hab irgendwo nen Fehler  Nochmal: ich bin nicht darauf aus, EIN Jar zu exportieren. Von mir aus koennen alle referenzierten Resourcen in einem ./lib-Verzeichnis liegen, also in der Form

./meinJar.jar (enthaelt main class)
./lib/dependent.jar (keine main classes)


entsprechend sollte dann in META-INF/MANIFEST.MF stehen

Class-Path: lib/




> Sollten diese Resourcen schon als JAR vorhanden sein, kopiere ich diese einfach in den im Manifest angegebenen Ordner in das Verzeichnis, wo mein eigentliches "Haupt-Jar" liegt.



Und wie sieht dazu der Eintrag im Manifest aus?


Vielen Dank 

[/quote]


----------



## The_S (28. Jun 2007)

Achso, dachte du möchtest ein einziges JAR. Der Eintrag im Manifest sieht aus, wie das Beispiel von deiner Seite

_Class-Path: myplace/myjar.jar . myplace/other.jar jardir/ _

dabei darfst du aber nicht erwarten, dass Eclipse automatisch die dort angegebenen JARs mit in den Ordner kopiert, wo du dein Haupt-Jar hinspeicherst!


----------



## public_void_main (28. Jun 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Achso, dachte du möchtest ein einziges JAR. Der Eintrag im Manifest sieht aus, wie das Beispiel von deiner Seite
> 
> _Class-Path: myplace/myjar.jar . myplace/other.jar jardir/ _
> 
> dabei darfst du aber nicht erwarten, dass Eclipse automatisch die dort angegebenen JARs mit in den Ordner kopiert, wo du dein Haupt-Jar hinspeicherst!



Nein, das mache ich noch manuell bzw. das kann man ja spaeter mit Ant leicht erledigen.
Und genauso wie oben angeben, habe ich den Class-Path fuer mein Testprojekt ja auch konfiguriert. Und es funktioniert nicht wie erwartet  :bahnhof: 

Kannst du nicht einmal schauen, was hier falsch ist? 
das eclipse-Project inkl. dem Manifest-file liegt wie gesagt hier: http://ablage.georgstach.de/jartest.zip
Das exportierte Jar OHNE die abhaengige lib: http://ablage.georgstach.de/exported.jar

Ich habe mir vorgestellt (haha, ob das so wahr ist?), dass man nun folgende Verzeichnisstruktur erstellt:

./exported.jar
./lib/gwt-user.jar  (wie im Manifest notiert)

Das lib-Verzeichnis ist im ersten Link mit dem eclipse-Projekt enthalten.
Besten dank.


----------



## The_S (28. Jun 2007)

Versuch mal, ob es klappt, wenn du im Manifest den führenden Punkt und den darauffolgenden Slash weglässt. Desweiteren ist eine Leerzeile am ende des Manifests wichtig!


----------



## public_void_main (28. Jun 2007)

Jappa! Das hat geklappt!

Und es lag nicht am Punkt --- sondern an der Leerzeile am Ende!!!
welcher Idiot (sorry) hat sich nur diese Spezifikation ausgedacht? Ich hoffe, da steht nicht wirklich ein tieferer Sinn hinter...

Vielen Dank, Hobbit!

EDIT: Wie kann man dieses Haekchen neben dem Beitrag setzen, um zu zeigen dass das Problem geloest ist?


----------



## The_S (28. Jun 2007)

Links unten hast du einen Button dazu.

Irgendwie kommts mir so vor, als ob das Prob viel schneller hätte gelöst sein können. Z. B. durch die Frage

"Was ist an diesem Manifest

_Manifest_

falsch?"


----------



## public_void_main (28. Jun 2007)

LOL ja  Wenn man die Nadel im Heuhaufen schon kennen wuerde ;-)

Vermutlich haette ich die Datei hier gepostet, nur die Leerzeile uebersieht man so leicht! *G*

Wie kann ich den Thread auf 'beantwortet' stellen?


----------



## The_S (28. Jun 2007)

public_void_main hat gesagt.:
			
		

> Wie kann ich den Thread auf 'beantwortet' stellen?



Wie gesagt, links unten am Seitenende ist ein kleiner Button (Haken) dafür vorgesehen.


----------



## public_void_main (28. Jun 2007)

ahhhhhhhhhh


----------

