Резюме
Как вы можете сделать ant несколько раз генерировать байт-идентичные файлы jar из тех же .class файлов?
Фон
Наш процесс сборки делает следующее:
- получает файлы определения веб-сервисов (wsdl) из другого репозитория источника приложения.
- запускает wsdl2java для создания файла .java для использования клиентами веб-сервиса (например, наше приложение)
- компилирует java файлы
- создает файл .jar из выходного файла компилятора
- проверяет файл артефакта в исходном элементе управления
Примечание. Мы делаем этот последний шаг, чтобы разработчики имели доступ к этому файлу jar без его создания. Мы используем специальный "производный" каталог, чтобы отличать источник от артефактов.
Проблема
Мы не можем получить ant для генерации байт-идентичных .jar файлов, даже если исходные файлы не изменились, т.е. каждая сборка генерирует несколько другую банку (с другим MD5)
Я проверил Интернет и нашел этот вопрос примерно через 5 лет назад:
Если я скомпилирую некоторый код и создаю jar и связанный файл md5 с помощью ANTконтрольная сумма в файле md5 отличается каждый раз, даже если код не изменился. Любая идея, почему это так, как можно обойти? Я подозреваю, что какая-то информация о временной отметке куда-то прибывает.
http://www.velocityreviews.com/forums/t150783-creating-new-jar-same-code-different-md5.html
В ответах я попытался сделать следующее:
- установите метку времени на "0" во всех файлах .class перед jarring
- указание файла манифеста, а также установление метки времени 0 для этого манифеста
[Примечание: этот второй шаг кажется неэффективным. См. Ниже]
После каждой сборки файл .jar по-прежнему имеет другую сумму MD5.
Файл CSI: Jar
Я не привязан и проверен, а баны как содержимого, так и временных меток совпадают между "разными" банками с одним исключением: разные временные метки для META-INF/MANIFEST.MF.
код
<-- touch classes and manifest to set consistent timestamp across builds -->
<touch millis="0">
<fileset dir="${mycompany.ws.classes.dir}"/>
</touch>
<touch millis="0" file="mymanifest.mf"/>
<jar destfile="${derived.lib.dir}/mycompanyws.jar"
manifest="mymanifest.mf"
basedir="${mycompany.ws.classes.dir}"
includes="**/com/mycompany/**,**/org/apache/xml/**"
/>
Другие параметры
Мы могли бы использовать fancier ant для программирования только в файле .jar, если изменились .java файлы.