Настройка JDK, содержащего только javac - PullRequest
1 голос
/ 23 февраля 2020

Можно ли установить JDK только с javac надежным способом, без удаления и добавления компонентов до тех пор, пока он не запустится (методом проб и ошибок)?

В моем сценарии использования я хотел бы создать Linux основанный Docker образ, который содержит несколько javac версий, а затем использует том для предоставления исходных файлов для компиляции и один для получения скомпилированных файлов классов. Контейнер должен иметь возможность компилировать только Java классы, ничего больше.
Установка пакетов JDK из репозитория пакетов дистрибутива Linux и загрузка тех, которые недоступны в виде пакетов вручную из https://jdk.java.net/archive/, безусловно, вариант, но они довольно большие (~ 190 МБ каждая версия) и содержат дублированный контент и контент, не необходимый для компиляции.

Я заметил, что jmods/jdk.compiler.jmod содержит javac в bin папка. Извлечь и выполнить его не удалось из-за отсутствия библиотек, поэтому я попытался объединить его содержимое с модулями, помеченными как требуется в module-info:

  • java.base
  • java.compiler

Однако, когда я попытался запустить javac, я получил:

Произошла ошибка при инициализации ВМ
Не удалось установить путь к классу загрузки.

Любые подсказки в правильном направлении приветствуются.

1 Ответ

2 голосов
/ 29 февраля 2020

В версиях JDK> = 9 можно использовать инструмент jlink:

jlink --add-modules jdk.compiler --output my-path

Это создает пользовательский образ времени выполнения (здесь, в каталоге my-path), содержащий необходимые библиотеки и двоичный файл bin/javac. Однако обратите внимание, что таким образом большинство модулей, которые являются частью java.se (например, SQL, XML и классы рабочего стола), отсутствуют и должны быть предоставлены при вызове javac.

Размер образа во время выполнения может быть дополнительно уменьшен с помощью следующих плагинов:

  • --compress=2: использовать сжатие ZIP
  • --no-header-files: исключить файлы заголовков
  • --no-man-pages: Исключая справочные страницы
  • --strip-debug: Отладка отладочной информации, включает опции (которые могут быть установлены отдельно после JDK 13):
    • --strip-java-debug-attributes: Разборки отладочная информация из Java файлов классов
    • --strip-native-debug-symbols (только Linux, требуется objcopy): удаляет символы отладки из исполняемых файлов и общих библиотек
  • --vm=server: включать только серверную JVM

(используйте jlink --list-plugins для просмотра всех доступных плагинов)

Для JDK 13, размер которого составляет примерно 190 МБ, создается папка с содержимым всего 42 МБ.

...