Сводка
Как заставить муравей многократно генерировать идентичные байту файлы jar из одних и тех же файлов .class?
Фон
Наш процесс сборки выполняет следующее:
- получает файлы определения веб-сервисов (wsdl) из исходного хранилища другого приложения
- запускает wsdl2java для генерации файла .java для использования.клиентами веб-служб (т.е. нашим приложением)
- компилирует java-файлы
- генерирует файл .jar из выходных данных компилятора
- проверяет файл jar "артефакта" в исходном кодеcontrol
Примечание. Мы делаем этот последний шаг, чтобы разработчики имели доступ к этому файлу JAR без его сборки.Мы используем специальный «производный» каталог, чтобы отличить источник от артефактов.
Проблема
Мы не можем заставить ant генерировать идентичные байту файлы .jar, даже еслиисходные файлы не изменились, т. е. каждая сборка генерирует немного разные jar (с разными MD5)
Я проверил интернет и нашел этот вопрос около 5 лет назад:
Если яскомпилируйте некоторый код и создайте jar-файл и связанный с ним файл md5, используя ANT, контрольная сумма в файле md5 каждый раз отличается, даже если код не изменился.Есть идеи, почему это так, как это можно обойти?Я подозреваю, что где-то есть информация о метках времени.
http://www.velocityreviews.com/forums/t150783-creating-new-jar-same-code-different-md5.html
В ответах я попытался сделать следующее:
- settingотметка времени «0» во всех файлах .class перед jarring
- с указанием файла манифеста и установкой отметки времени 0 для этого манифеста
[Примечание: этот второй шаг кажется неэффективным,См. Ниже]
После каждой сборки файл .jar still имеет различную сумму MD5.
CSI: файл JAR
Я не испортил и не исследовал, и содержимое и метки 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/**"
/>
Другие параметры
Мы могли бы использовать более необычное программирование длятолько проверяйте в файле .jar, если файлы .java были изменены.