# aus mehreren jar files, ein großes basteln



## vodn7v (3. Mrz 2009)

Hallo,
ich habe mehrere jar files und möchte diese zu einem großen jar file zusammenfügen. 
ist sowas überhaupt möglich? 
wenn ja nach welchem stichwort muss ich da zuerst suchen ??

vielen dank !!


----------



## The_S (3. Mrz 2009)

Mit dem Eclipse-Plugin FatJAR geht das. Du solltest dir aber die Frage stellen, ob das 

a) rechtlich möglich
b) sinnvoll ist


----------



## vodn7v (3. Mrz 2009)

danke, das hört sich schonmal gut an. soweit ich gelesen habe kann man damit ein ganzes projekt als jar verpacken und es starten.
ich möchte aber lediglch 30 einzelne jar dateien zu einer großen jar datei zusammenführen, die dann in mein projekt integriert werden kann.

ist das damit auch möglich ??

danke !!


----------



## mvitz (3. Mrz 2009)

Klar, alle .class entpacken und alle zusammen in ein jar wieder verpacken. Kannst du höchstens Probleme mit dem manifest.mf bekommen.

Aber die große Frage dabei ist, ob das mit den von dir benutzten Libraries lizenzrechtlich aussieht.


----------



## maki (3. Mrz 2009)

30 jars in eine jar packen um sie ins Projekt zu "integrieren"?
Da müsste man sich schon sehr genau überlegen ob das wirklich sinnvoll ist.


----------



## vodn7v (3. Mrz 2009)

lizensrechtlich ist das, denke ich kein problem. ich möchte es ja nur übersichtlich halten. die ganzen jar dateien die ich fuer mein framework benötige sind lizenstechnisch unter lgpl oder gpl und ich möchte es einfach etwas übersichtlicher haben =)
und aus ca 30 jar dateien die klassen rauszuholen um mir daraus wieder eine einzelne jar datei zu basteln, ist mir ein bischen viel aufwand. ich dachte das es irgednwie einfacher geht. 

alle jars makieren, rechtsklickt --> jars zusammenführen ^^

aber so einfach geht das wohl nicht oder?  =)

danke !!


----------



## Ebenius (3. Mrz 2009)

Du veröffentlichst Deine Software selbst unter GPL? Dann ist das neu zusammenpacken von LGPL und GPL-Bibliotheken kein Problem, sofern Du alle Lizenzen ausweist und den Quelltext entsprechend verfügbar machst.

BTW: Das Zusammenpacken ist ja nicht aufwendig: 
	
	
	
	





```
#! /bin/bash

# standard test whether selfdir exists
case "$0" in
  /*) self=$0 ;;
   *) self="$(pwd)/$0" ;;
esac

set -e

selfdir="$( (cd "${self%/?*}" && pwd) )"
[ "${selfdir}" ] || exit 1

# first argument is target JAR file
if [ $# -ne 1 ] ; then
  echo 2>&1 "Usage: "
  echo 2>&1 "$0 TargetJarFile"
  exit -2
fi

# create tmp dir
test -d "${TMPDIR}" || (echo 2>&1 "Temp dir '${TMPDIR}' does not exist" ; exit -1)
tmp="${TMPDIR}/jarbundle,$(date '+%Y%m%d%H%M%S')"

# unpack all *.jar
(
  mkdir "${tmp}"
  indir="$(pwd)"
  cd "${tmp}"
  for f in "${indir}/"*.jar ; do
    jar -xf "$f"
  done
)

# pack all unpacked files
jar -cf "$1" -C "${tmp}" .
jar -i "$1"

# remove tmp dir
rm -rf "${tmp}"
```

Ebenius


----------



## ice-breaker (3. Mrz 2009)

Ebenius hat gesagt.:


> Du veröffentlichst Deine Software selbst unter GPL? Dann ist das neu zusammenpacken von LGPL und GPL-Bibliotheken kein Problem, sofern Du alle Lizenzen ausweist und den Quelltext entsprechend verfügbar machst.



das Programm muss erst wieder unter die GPL gestellt werden, sobald es distributed wird, für den "privaten" Gebrauch (keine Weitergabe) "entfallen" also die Bedingungen der Herausgabe:
Frequently Asked Questions about the GNU Licenses - GNU Project - Free Software Foundation (FSF)


----------



## Ebenius (3. Mrz 2009)

Entschuldigung; mir war das klar, hätte ich genauer ausführen sollen.

Ebenius


----------



## mvitz (3. Mrz 2009)

Wahlweise zur bash Variante von Ebenius hier das ganze mithilfe von Groovy & Ant (Dementsprechend kann man das ganze auch nur mithilfe von Ant regeln, die Tasks dafür sind: (mkdir, unjar (mit innerem fileset), jar, delete)

[HIGHLIGHT="Java"]// source directory
def myDir = "/home/mvitz/test"
def myFile = "neuesJar.jar"
// Creating temp file
def tmpDir = "$myDir/temp"
def ant = new AntBuilder()
ant.mkdir(dir:tmpDir)
// Unjar each jar file
ant.unjar(dest:tmpDir) {
    fileset(dir:myDir) {
        include(name:"*.jar")
    }
}
// Create new jar file
ant.jar(basedir:tmpDir, destfile:"$myDir/$myFile")
// Remove temp directory
ant.delete(dir:tmpDir)[/HIGHLIGHT]


----------



## thE_29 (3. Mrz 2009)

Auch hier gibts in den FAQ ein HowTO wie das geht


----------



## Wildcard (3. Mrz 2009)

Als Anmerkung: In kürze wird so ein 'fat jar' mit Eclipse möglich sein oder das rechtlich in der Grauzone befindliche FatJar Plugin.
Der Eclipse Jar Export Wizard wird vermutlich ab 3.5 die Option anbieten ein single jar zu erzeugen und installiert dann einen custom ClassLoader der jar in jar versteht.


----------



## The_S (4. Mrz 2009)

@Wildcard

klingt interessant (ob das jetzt positiv oder negativ ist, sei mal dahingestellt). Woher hast du die Info? Oder ist das für euch Eclipse-Programmierer wieder was internes  ?


----------



## thE_29 (4. Mrz 2009)

Wieso isn das Plugin in einer rechtlichen grauen Zone?!


----------



## Wildcard (4. Mrz 2009)

The_S hat gesagt.:


> klingt interessant (ob das jetzt positiv oder negativ ist, sei mal dahingestellt). Woher hast du die Info? Oder ist das für euch Eclipse-Programmierer wieder was internes  ?


https://bugs.eclipse.org/bugs/show_bug.cgi?id=219530



> Wieso isn das Plugin in einer rechtlichen grauen Zone?!


Es stellt sich die Frage in wie weit du etwas as-is auslieferst, wenn du es auspackst und neu zusammen packst. Je nach Lizenz kann das problematisch sein bzgw. an besondere Auflagen gekoppelt sein


----------



## The_S (5. Mrz 2009)

ah, thx (noch die 10 Zeichen vollbekommen ...)


----------



## thE_29 (5. Mrz 2009)

Nunja, dafür kann das Plugin nix!
Das ist das gleiche als wenn man sagen würde, DVD-Brenner sind in der grauen Zone! 
Man kann damit DVD Raubkopien erstellen, aber auch seine Bilder brennen...

Liegt halt am Anwender, sich vorher die Lizenz anzugucken


----------



## Wildcard (5. Mrz 2009)

Ja, sorry, das war inkorrekt ausgedrückt. Natürlich nicht das Plugin selbst, sondern dessen Verwendung kann rechtlich problematisch sein.


----------



## vodn7v (6. Mrz 2009)

@all: erstmal vielen dank fuer die ganzen antworten !! =)

@The_S: ich habe das mit dem FatJar ausprobiert und versucht die Jar mit hilfe des Tutorials zu erstellen. Leider bekomme ich ab einem bestimmten punkt immer eine Fehlermeldung.

Projekt demolib erstellt --> rechtsklick auf das projekt --> Build Fat Jar 

Dann bekomme ich immer diese "Fehler-" Meldung: Information: The chosen operation is currently not available.


Kennt das jemant??

Ansonsten versuche ich jetzt erstmal die variante  aus der Faq.

Danke euch !!


----------



## The_S (6. Mrz 2009)

vodn7v hat gesagt.:


> @The_S: ich habe das mit dem FatJar ausprobiert und versucht die Jar mit hilfe des Tutorials zu erstellen. Leider bekomme ich ab einem bestimmten punkt immer eine Fehlermeldung.



Sorry, ich halte von der Jars-ineinander-reinpackerei nichts und habe deshalb auch keinerlei Erfahrung mit FatJAR - ich weiß lediglich, dass es existiert. Sorry!


----------



## vodn7v (6. Mrz 2009)

@thE_29

vielen Dank. laut FAQ HowTo funktionierts =)

vielen Danke !!!


----------



## thE_29 (6. Mrz 2009)

Tjo, ich mach das meistens so, wenn ich keine IDE zur Hand habe 

Da ich bald auf Eclipse umsteigen werde (bzw, muss) mache ich vielleicht da ein Plugin


----------



## vodn7v (6. Mrz 2009)

puh. ich nochmal.. also irgednwie funktioniert es doch nicht. habe es mit 2 jars versucht. aber es geht nicht bei allen.

habe mir eine batch datei geschrieben, die das handelt. 

bei manchen entpackten jars bekomme ich beim kopieren in die große jar folgende fehlermeldung:

z.B. org/mylin/xml/XsdDOMValidator.class <ein = 5343> <aus 2543> <Komprimiert 52%>  ....

Fehlermeldung: 


```
java.lang.ClassCastException: java.io.File
	at sun.tools.jar.Main.update(Main.java:434)
	at sun.tools.jar.Main.run(Main.java:166)
	at sun.tools.jar.Main.main(Main.java:903)
```

das habe ich bei manchen jar files.. nicht allen.

ist dir sowas bekannt ?

danke!


EDIT:

sehr merkwürdig.. wenn ich die klassen einzeln in die jar kopiere dann funktionierts. wenn ich alles per batch ablaufen lasse nicht. sind es vllt zu viele? 

danke


----------

