#java #jlink #binary-reproducibility
#java #jlink ( ссылка ) #двоичный файл-воспроизводимость #jlink
Вопрос:
Уменьшенный JDK (созданный с помощью jlink
) является частью нашего приложения. Требуемые модули для образа JDK редко меняются. К сожалению, создание нового образа JDK (с точно такими же jlink
параметрами) приводит к разным результатам, поэтому клиентам приходится загружать один и тот же файл снова и снова во время дифференциального обновления без необходимости.
Вот PoC:
$ mkdir jdk-15a jdk-15b
$ tar xzf openjdk-15_linux-x64_bin.tar.gz --directory jdk-15a/
$ tar xzf openjdk-15_linux-x64_bin.tar.gz --directory jdk-15b/
$ jdk-15a/jdk-15/bin/jlink --compress=1 --module-path jdk-15a/jdk-15/jmods --add-modules java.base,jdk.management,jdk.unsupported,jdk.charsets --output output01
$ jdk-15b/jdk-15/bin/jlink --compress=1 --module-path jdk-15b/jdk-15/jmods --add-modules java.base,jdk.management,jdk.unsupported,jdk.charsets --output output02
$ md5sum output*/lib/modules
9ae5ae63df59593a0892c5ed411d7e59 output01/lib/modules
24b4af31553670799ab286ad1186329e output02/lib/modules
(Я использую каталоги jdk-15a
и jdk-15b
, аналогичные экземплярам JDK, на нескольких серверах сборки.)
Есть ли какой-либо способ получить побайтно идентичный вывод (воспроизводимую сборку) из jlink
в этом случае?
Используемая версия JDK:
$ cat jdk-15a/jdk-15/release
IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION="15"
JAVA_VERSION_DATE="2020-09-15"
...
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=".:hg:e3f940bd3c8f"
Комментарии:
1. Существует JDK-8241602 , который утверждает, что он исправлен в jdk-15 build 22. Какую версию вы используете?
2. @Marcono1234: Спасибо за ссылку! Это сборка 36 (2020/8/11). Должен ли я сообщать об этом как о регрессии?
3. Да, я думаю, было бы хорошо, если бы вы это сделали. Я также немного смущен их исправлением для JDK-8241602, поскольку оно, похоже, на самом деле не решает основную проблему (коллекция не упорядочивается?).
4. Хорошо, я сообщил о bugreport.java.com .
5. Отлично, не могли бы вы, пожалуйста, обновить этот вопрос, как только будет создан общедоступный отчет об ошибке.
Ответ №1:
Это ошибка JDK, о которой сообщается в JDK-8252730.