Как сделать задачу Ant подписать и упаковать все мои JAR-файлы? - PullRequest
9 голосов
/ 22 июля 2010

Мои JAR-файлы должны быть подписаны для приложения веб-запуска. Было бы неплохо также упаковать их, чтобы минимизировать время загрузки. Я пытаюсь настроить задачу Ant для автоматического выполнения ее при развертывании приложения. Поскольку процесс упаковки реорганизует внутреннюю структуру jar и делает подпись недействительной, документация Pack200 рекомендует выполнить 3 этапа:

  1. Перепакуйте JAR с pack200
  2. Подпишите банку с jarsigner
  3. Сжатие JAR-файла JAR с помощью pack200 для создания файла .jar.pack.gz

Ant имеет задание по умолчанию signjar, а Sun опубликовала Ant200 задачу Pack200 .

Проблема в том, что задача Sun pack200 одновременно работает только с одним файлом, а операция перепаковки должна указывать выходной файл.

Я считаю, что это должна быть довольно распространенная операция, но мой файл ant становится слишком сложным, и в нем слишком много временных файлов. Время просить мудрости сообщества:

Существует ли простой или, по крайней мере, стандартный способ упаковать и подписать все мои файлы JAR?

Ответы [ 3 ]

10 голосов
/ 18 августа 2010

Вот мое собственное решение.Я отказался от предварительной сборки ant target и решил запустить непосредственно исполняемый файл pack200.

У этого подхода есть некоторые преимущества:

  • работает (jarsigner не смог проверить некоторые jar-файлы)
  • нет зависимостей, кроме jdk
  • itне тратит много времени на перепаковку уже перепакованных jar-файлов
  • , он может подписывать и перепаковывать встроенные файлы, что позволяет мне поставить подписанную версию под контроль версий.Нет необходимости подписывать дважды.

Вот код макроса, который перепаковывает и подписывает встроенный код:

<macrodef name="repack-and-sign">
    <attribute name ="rootdir"/>
    <sequential>
            <echo message="Repacking libs in @{rootdir}"/>
        <apply executable="pack200" parallel="false">
            <arg value="--repack"/> 
            <arg value="--segment-limit=-1"/> 
            <fileset dir="@{rootdir}" includes="**/*.jar" />
        </apply>

        <echo message="Signing libs in @{rootdir}"/>
        <signjar 
            alias="${keystore.alias}" keystore="${keystore.file}" storepass="${keystore.password}"
            lazy="true">
            <path>
                <fileset dir="@{rootdir}" includes="**/*.jar" />
            </path>
        </signjar>
     </sequential>
</macrodef>

А вот как упаковать:

    <apply executable="pack200" parallel="false" dest="${dir.tomcat.jar}">
        <arg value="--modification-time=latest"/>
        <arg value="--deflate-hint=true"/>
        <arg value="--segment-limit=-1"/>
        <targetfile/>
        <srcfile/>
        <fileset dir="${dir.tomcat.jar}" includes="**/*.jar" />
    <mapper type="glob" from="*" to="*.pack.gz" />
    </apply>

Отредактировано, чтобы предоставить немного больше информации людям, которые не очень хорошо знают муравья:

Вышеуказанная задача идет перед вашими тегами.Внутри вашего тега сначала поместите вызов в макрос, как этот, чтобы он сначала перепаковывал и подписывал каждый файл:

    <repack-and-sign rootdir="${dir.tomcat.jar}" />

Затем следуйте этому метке сверху.Это сделает окончательную упаковку для каждого файла.

1 голос
/ 04 августа 2011

Задачи Pack200 на Java.net были обновлены для работы с наборами файлов. Попробуйте еще раз:

http://java.net/projects/deployment

1 голос
/ 16 августа 2010

Вы можете использовать набор файлов в задаче signjar

<signjar alias="ws" keypass="wskey"
                 storepass="wspass" keystore="${artifact.root.dir}/deployJAWS.key">
            <fileset dir="${lib.temp.root.dir}">
                <include name="**/*.jar" />
            </fileset>
</signjar>

Я использую приведенный выше фрагмент для подписи моего приложения WebStart, которое состоит из приблизительно 70 банок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...