it-swarm.com.ru

Как объединить два файла Jar

Можно ли объединить два jar-файла так, чтобы в теге апплета я мог просто сделать что-то вроде

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

Мне нужен только один файл jar, поэтому размещение двух файлов jar в папке мне не поможет.

25
Tony

Конечно, просто распакуйте два jar-файла и создайте новый.

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

Материал с tmp обеспечивает извлечение двух существующих jar-файлов в чистый каталог, а затем из него создается новый.

Имейте в виду, что вам также может потребоваться объединить любые содержащиеся в нем manifest.mf файлы, и, если они есть, также включите опцию '-m' в эту файловую команду.

64
Alnitak

Используйте zipgroupfileset с задачей Ant Zip

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

Могу помочь тебе.

5
ykombinator

Если вы используете gradle, просто добавьте следующее в build.gradle. Никаких плагинов не требуется. Если вам нужны специальные опции, тогда используйте плагин Fatjar, как предполагает initialZero. 

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". Найти jar в 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

Просто распакуйте оба jar-файла, затем сожмите результаты в один Zip-файл и переименуйте его в jar снова.

Но, как сказал адаршр: для этого лучше использовать команду jar.

1
Daniel

Существует также плагин Eclipse Fatjar.

1
initialZero

Извлеките обе банки и создайте новую. (Используйте команды jar, показанные выше) Одно предостережение о файле манифеста - вы хотите извлечь файл jar, файл манифеста которого вы хотите сохранить в последнем. 

0
sumanth.donthula
<?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.

Он сгенерирует out.jar, который является комбинацией всех jar-файлов.

0
Chetna rustagi

Я знаю, что это старый вопрос, и я просто хотел добавить свои два цента (пока нет разрешения комментировать, поэтому создаю новый ответ).

Я вижу значение в ответе sumanth.donthula, так как проблема для всех нас, сливающихся в jar, заключается в том, как обращаться с файлами манифеста. В моем случае я хотел объединить некоторые библиотечные файлы (в основном сгенерированный клиентский код веб-службы) в банку приложения, написанного мной. Было нормально заменить манифесты на мою собственную.

Самый простой способ сделать это - позаботиться о порядке, в котором вы распаковываете исходные файлы (как отметили Alnitak и sumanth.donthula).

Я хотел использовать задание Zip ant (спасибо, ykombinator, за идею). Оказалось, что единственный способ контролировать порядок сжатия/упаковки - переименование файлов. Смотрите мою цель муравья ниже.

Выходной каталог в моем примере называется codemodule.dir (я создал модуль кода FileNet). Остальные имена говорят сами за себя. Важным шагом является переименование jar приложения в 0 _..., чтобы он стал первым по порядку. Таким образом, его манифест будет сохранен, так как для атрибута duplicate задачи 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