web-dev-qa-db-ja.com

2つのJarファイルを結合する方法

2つのjarファイルを組み合わせて、アプレットタグで次のようなことを簡単に行うことができますか?

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

1つのjarファイルだけが必要なので、2つのjarファイルをフォルダーに入れても役に立ちません。

31
Tony

両方のJARファイルを抽出して、再生成する必要があります。

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

cd tmp
jar -cvf jar3.jar .

以下の回答 を参照してください。

8
adarshr

確かに、2つのjarファイルを抽出して新しいファイルを再作成するだけです

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

tmpを使用することにより、2つの既存のjarがクリーンなディレクトリに抽出され、次に新しいディレクトリが作成されます。

そこに含まれるmanifest.mfファイルもマージする必要があり、もしあれば、そのファイルコマンドに '-m'オプションも含める必要があることに注意してください。

75
Alnitak

Ant Zipタスク でzipgroupfilesetを使用します

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

あなたを助けるかもしれません。

5
ykombinator

Gradleを使用している場合、以下をbuild.gradleに追加するだけです。プラグインは必要ありません。特別なオプションが必要な場合は、initialZeroが示唆するように、Fatjarプラグインを使用してください。

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

Androidプロジェクトの場合、これをapp/build.gradleに追加し、「gradlew superSimpleJar」を実行します。build/ libs/app-all.jarで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

両方のjarファイルを解凍し、結果を1つのZipファイルに圧縮し、これを再度jarに変更します。

しかし、adarshrが述べたように、そのためにはjarコマンドを使用した方が良いでしょう。

1
Daniel
<?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>

このコードをbuild.xmlファイルに保存し、結合するすべてのjarファイルが保存されているのと同じフォルダーに保存します。 cmdを開き、フォルダーのパスを指定してコマンドant Zipを実行します。

すべてのjarの組み合わせであるout.jarを生成します。

1
Chetna rustagi

Eclipse fatjarプラグインもあります。

1
initialZero

両方のjarファイルを抽出して、新しいjarファイルを作成します。 (上記のjarコマンドを使用します)。マニフェストファイルに関する1つの注意点は、マニフェストファイルを最後に保持するjarを抽出することです。

0

私はそれが古い質問であることを知っていて、2セントを追加したかっただけです(まだコメントする許可がないため、新しい回答を作成します)。

Jarをマージするすべての人にとって問題はマニフェストファイルの処理方法になるため、sumanth.donthulaの答えには価値があると思います。私の場合、いくつかのライブラリファイル(主に生成されたWebサービスクライアントコード)を、私が作成したアプリケーションのjarにマージしたかったのです。マニフェストを自分のjarファイルに置き換えてもかまいませんでした。

これを行う最も簡単な方法は、元のファイルを解凍する順序に注意することです(Alnitakとsumanth.donthulaが述べたように)。

Zip antタスクを使用したかった(アイデアをありがとう、ykombinator)。圧縮/パッケージングの順序を制御する唯一の方法は、ファイルの名前を変更することであることが判明しました。以下の私のターゲットを参照してください。

この例の出力ディレクトリはcodemodule.dirと呼ばれます(FileNetコードモジュールを作成しました)。残りの名前は自明です。重要なステップは、アプリケーションjarの名前を0 _...に変更して、1番目の順序にすることです。この方法では、Zip antタスクの重複属性が保持するように設定されているため、マニフェストが保持されます。

<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