wake-up-neo.net

So kombinieren Sie zwei Jar-Dateien

Ist es möglich, zwei JAR-Dateien so zu kombinieren, dass ich in einem Applet-Tag einfach so etwas tun kann

archive="jarjar.jar/jar1.jar"...  ...archive="jarjar.jar/jar2.jar"... instead of
archive="jar1.jar"... ...archive="jar2.jar"...

Ich brauche nur eine JAR-Datei, so dass es mir nicht helfen wird, zwei JAR-Dateien in einen Ordner zu legen.

25
Tony

Sie müssen beide JAR-Dateien extrahieren und neu generieren.

jar -xvf jar1.jar tmp
jar -xvf jar2.jar tmp

cd tmp
jar -cvf jar3.jar .

Bitte beziehen Sie sich auf die folgende Antwort .

8
adarshr

Sicher, extrahieren Sie einfach die beiden JAR-Dateien und erstellen Sie eine neue

$ mkdir tmp
$ (cd tmp; unzip -uo ../jar1.jar)
$ (cd tmp; unzip -uo ../jar2.jar)
$ jar -cvf combined.jar -C tmp .

Das Zeug mit tmp sorgt dafür, dass die zwei vorhandenen Jars in ein sauberes Verzeichnis entpackt werden und das neue daraus erstellt wird.

Beachten Sie, dass Sie möglicherweise auch die darin enthaltenen manifest.mf-Dateien zusammenführen müssen, und falls vorhanden, auch die Option '-m' in diesen Dateibefehl aufnehmen.

64
Alnitak

Verwenden Sie zipgroupfileset mit der Ant Zip-Task

<Zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</Zip>

Könnte dir helfen.

5
ykombinator

Wenn Sie Gradle verwenden, fügen Sie einfach Folgendes zu build.gradle hinzu. Keine Plugins erforderlich. Wenn Sie spezielle Optionen benötigen, verwenden Sie das Fatjar-Plugin, wie anfänglich Zero vorschlägt. 

task superSimpleJar(type: Jar) {
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it :     zipTree(it) } }
    with jar
}

Fügen Sie dies für Android-Projekte zu app/build.gradle hinzu und führen Sie "gradlew superSimpleJar" aus. Suchen Sie jar in build/libs/app-all.jar

task superSimpleJar(type: Jar) {
baseName = project.name + '-all'
from {

    configurations.compile.findAll {

    it.getName() != 'Android.jar'

    }.collect {

    it.isDirectory() ? it : zipTree(it)

    }
 }
}
2
Charlie Dalsass

Entpacken Sie einfach beide JAR-Dateien, packen Sie dann die Ergebnisse in eine ZIP-Datei und benennen Sie sie erneut in jar um.

Aber wie Adarshr sagte: Verwenden Sie dafür besser den Jar-Befehl.

1
Daniel

Es gibt auch das Eclipse Fatjar Plugin.

1
initialZero

Extrahieren Sie beide Gläser und erstellen Sie eine neue Arbeit. (Verwenden Sie die oben beschriebenen jar-Befehle.) . Eine Einschränkung bei der Manifestdatei ist, dass Sie den Jar extrahieren möchten, dessen Manifestdatei Sie zuletzt behalten möchten. 

0
<?xml version="1.0" encoding="UTF-8"?>
<project name="Zip-test" default="Zip" basedir=".">

    <target name="Zip">
        <Zip destfile="out.jar">
            <zipgroupfileset dir="." includes="*.jar"/>
        </Zip>
    </target>
</project>

speichern Sie diesen Code in der Datei build.xml und bewahren Sie ihn in demselben Ordner auf, in dem sich alle zu kombinierenden JAR-Dateien befinden. Öffnen Sie cmd, geben Sie den Ordnerpfad an und führen Sie den Befehl aus: ant Zip.

Es generiert out.jar, eine Kombination aller Gläser.

0
Chetna rustagi

Ich weiß, dass es eine alte Frage ist und ich wollte nur meine zwei Cents hinzufügen (noch keine Erlaubnis, einen Kommentar abzugeben, also eine neue Antwort erstellen).

Ich sehe den Wert in der Antwort von sumanth.donthula als das Problem für uns alle, die Gläser zusammenführen, wird sein, wie man mit den Manifestdateien umgeht. In meinem Fall wollte ich einige Bibliotheksdateien (hauptsächlich generierten Web-Service-Client-Code) in das Glas einer von mir geschriebenen Anwendung einbinden. Es war in Ordnung, die Manifeste durch diejenige meines eigenen Glases zu ersetzen.

Am einfachsten ist es, die Reihenfolge einzuhalten, in der Sie die Originaldateien entpacken (wie Alnitak und sumanth.donthula festgestellt haben).

Ich wollte die Zip-Ameisenaufgabe verwenden (Danke, ykombinator, für die Idee). Es stellte sich heraus, dass die Reihenfolge der Komprimierung/Paketierung nur durch das Umbenennen der Dateien gesteuert werden kann. Siehe mein Ameisenziel unten.

Das Ausgabeverzeichnis in meinem Beispiel heißt codemodule.dir (ich habe ein FileNet-Codemodul erstellt). Der Rest der Namen erklärt sich von selbst. Der wichtige Schritt ist das Umbenennen des Anwendungs-Jar in 0 _..., um den ersten in Reihenfolge zu sein. Auf diese Weise bleibt das Manifest erhalten, da das doppelte Attribut der Zip-Ant-Task beibehalten wird.

<target name="merge_jars">
    <delete dir="${codemodule.dir}" quiet="true" />
    <mkdir dir="${codemodule.dir}" />
    <copy todir="${codemodule.dir}">
        <fileset dir="${lib.dir}" includes="*.jar"/>
        <fileset dir="${basedir}" includes="${app-name}.jar"/>
    </copy>
    <move file="${codemodule.dir}/${app-name}.jar" tofile="${codemodule.dir}/0_${app-name}.jar"/>
    <Zip destfile="${codemodule.dir}/${app-name}-fat.jar" duplicate="preserve">
      <zipgroupfileset dir="${codemodule.dir}">
        <include name="*.jar"/>
      </zipgroupfileset>
    </Zip>

0
booFar