Пользовательский JRE, созданный jlink, имеет большой размер для минимальной jre. - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь предоставить минимальную JRE для тонкого изображения Docker.В jlink 11.0.4, которая поставляется с open-jdk-11 в Ubuntu, образ, созданный с помощью этого пользовательского JRE, на самом деле больше, чем он был бы с JRE по умолчанию.Я думаю, что это связано с очень большим размером cutom_jre / lib / server / libjvm.so

Я слежу за Kubernetes для разработчиков Java из Аруна Гупты в Linkedin Learning.В какой-то момент я заметил странное поведение на моем экземпляре Ubuntu.Наряду с этим курсом мне нужно было предоставить пользовательскую JRE для минимального приложения Spring Boot, чтобы использовать его для тонкого образа Docker.

jlink \
--output myjre \
--add-modules $(jdeps --print-module-deps target/greeting.jar),\
java.xml,jdk.unsupported,java.sql,java.naming,java.desktop,\
java.management,java.security.jgss,java.instrument \

Этот подход отлично работал в курсе и размереmy_jre подходит для создания минимального образа Docker для приложения.Проблема в том, что в моей настройке я использовал openjdk-11, а не openjdk-9.

В моей настройке результирующий размер my_jre будет очень большим (~ 380 МБ).После некоторого исследования я обнаружил, что это было главным образом и, возможно, только из-за большого размера my_jre/lib/server/libjvm.so.

У меня не было никакого предшествующего опыта с jlink до этой попытки.После некоторых проб и ошибок и просмотра похожих проблем на github я нашел обходной путь, выходящий за пределы функциональности jlink.

Этот обходной путь происходит из пакета binutils и strip утилита.

Запуск утилиты strip с флагом --strip-unneeded уменьшит размер libjvm.so и сделает возможным достижение основной цели: обеспечение минимальной JRE (~ 113 МБ)) для тонкого изображения Docker.

strip -p --strip-unneeded myjre/lib/server/libjvm.so

Я был бы признателен за более глубокое объяснение происхождения этого чутья от человека, обладающего знаниями.И что изменилось с jdk9 на jdk11 с точки зрения этого поведения?Есть ли какой-нибудь стандартный процесс для достижения этой цели без каких-либо внешних утилит, кроме тех, которые предоставляет jdk9 +, таких как jlink?

...