Почему javac все еще нужен при компиляции с помощью maven-compiler-plugin

Я читал об этом в maven-compiler-plugin. На связанной странице было сказано:

В настоящее время подключаемый модуль компилятора связан с артефактом компилятора javac с артефактомId plexus-compiler-javac, который можно рассматривать как одну из зависимостей, объявленных внутри POM подключаемого модуля компилятора.

Насколько я понимаю, нам больше не нужен локальный javac, скажем, в моей локальной операционной системе достаточно просто JRE вместо JDK.

Я попытался удалить JDK и установил только JRE в своей локальной системе. Однако, когда я попытался скомпилировать с maven командой mvn clean compile, появилось сообщение об ошибке -

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

Может ли кто-нибудь объяснить, почему это так? Наверное, я неправильно понимаю?


person Rui    schedule 10.02.2018    source источник
comment
Насколько я понимаю, локальный javac нам больше не нужен. ну да, если вы не хотите что-то компилировать.   -  person Kayaman    schedule 10.02.2018
comment
@Kayaman, насколько я понимаю: если я хочу что-то скомпилировать, plexus-compiler-javac можно использовать вместо локального javac   -  person Rui    schedule 10.02.2018
comment
Какая часть вашего понимания неверна и основана на неверном предположении, основанном на неправильном прочтении документации?   -  person    schedule 10.02.2018
comment
Какую часть «вопреки названию этого плагина, плагин-компилятор сам по себе не компилирует исходники вашего проекта» вы не поняли? Это первая строка документации, которую вы процитировали.   -  person user207421    schedule 10.02.2018
comment
Прочитайте всю документацию для понимания в следующий раз. Акцент мой; Вопреки названию этого подключаемого модуля, подключаемый модуль компилятора не компилирует исходные коды вашего проекта сам по себе. Для компиляции подключаемый модуль компилятора использует другой класс для их компиляции. ПараметрcompileId определяет, какой класс будет использоваться. В настоящее время подключаемый модуль компилятора связан с артефактом компилятора javac с артефактомId plexus-compiler-javac, который можно рассматривать как одну из зависимостей, объявленных в POM подключаемого модуля компилятора.   -  person    schedule 10.02.2018
comment
Вам по-прежнему нужен компилятор Oracle Java, который находится в JDK, а не в JRE и недоступен отдельно от Maven Central.   -  person Thorbjørn Ravn Andersen    schedule 11.02.2018


Ответы (2)


Из документации:

Компилятор сплетения

Компилятор Plexus — это компонент Plexus, позволяющий использовать различные компиляторы через единый API.

Вопреки названию этого плагина, плагин-компилятор сам по себе не компилирует исходники вашего проекта.

Таким образом, артефакт plexus-compiler-javac должен рассматриваться как wrapper для компиляции.
Не указано, что он содержит программу javac.

Точнее, начиная с версии 3.0 по умолчанию используется не javac, а javax.tools (в частности, javax.tools.JavaCompiler).
maven-compiler-plugin действительно гласит:

Начиная с версии 3.0 компилятором по умолчанию является javax.tools.JavaCompiler (если вы используете java 1.6), и он используется для компиляции исходных кодов Java. Если вы хотите принудительно использовать плагин с помощью javac, вы должны настроить параметр плагина forceJavacCompilerUse.

Вы должны понимать, что основной плагин Maven не будет изобретать велосипед и угадывать, что вам нужно.
Для компиляции классов Java вам нужен компилятор Java, и, как правило, вы хотите быть уверены, что используете конкретный компилятор Java в качестве ОС. и версия Java имеет значение.
Таким образом, подключаемый модуль компилятора maven нуждается в JDK и использует его под капотом.

person davidxxx    schedule 10.02.2018
comment
Мы делали компиляции с помощью Maven, используя простую JRE, в которой нет javac, и подключаемый модуль компилятора plexus Eclipse — это было примерно в версии 3.5. Для проектов, которые действительно нуждаются в долгосрочной поддержке, это приемлемый вариант. - person Thorbjørn Ravn Andersen; 10.02.2018
comment
@ ThorbjørnRavnAndersen - это потому, что Eclipse включает собственный нестандартный компилятор в более старых версиях. Maven никогда не включал javac. Не уверен насчет сейчас, потому что я переключился на Intellij, как только он вышел. - person ; 10.02.2018
comment
@JarrodRoberson Я не уверен, что нестандартный компилятор - правильный термин. Они написали свой собственный, но формат байт-кода четко определен, поэтому обычно не имеет значения, какой компилятор выполнил эту работу. Те, кто работает в Eclipse, используют его постоянно. stackoverflow.com/a/33165304/53897 демонстрирует, как использовать его с maven. Дополнительная функция заключается в том, что он позволяет компилировать очень старый код с новыми версиями Java, где javac больше не будет. Я тоже не защищаю; конкуренция здорова в компиляторах. - person Thorbjørn Ravn Andersen; 11.02.2018

Maven не является компилятором Java. Maven запускает для вас компилятор Java и настраивает все пути.

Когда вы запустите mvn -X compile, вы увидите детали компилятора.

В заключение: вам нужен компилятор java, установленный для компиляции java - даже если maven запускает компилятор для вас.

person user2088476    schedule 10.02.2018
comment
Во-первых, спасибо за ваш ответ :) Тогда какова цель зависимости plexus-compiler-javac в maven-compiler-plugin? На мой взгляд, plexus-compiler-javac можно использовать вместо локального javac. Но кажется, что мое понимание неправильно. Если я ошибаюсь, я бы хотел, чтобы кто-нибудь помог изменить мое понимание :) - person Rui; 10.02.2018
comment
НЕТ этот артефакт поддерживает javac, он ничего не говорит о включении исполняемого файла javac, что было бы невозможно сделать независимым от платформы способом. Подумайте об этом, используйте здравый смысл. - person ; 10.02.2018
comment
@JarrodRoberson Отлично! Большое спасибо за объяснение :) Можете ответить формально, тогда я проверю :) (Y) - person Rui; 10.02.2018
comment
@JarrodRoberson Я не являюсь носителем английского языка, но когда я вижу, что плагин идет в комплекте с javac, у меня создается впечатление, что javac может быть также поставлен с плагином, а не просто использует в наличии javac. - person Pshemo; 10.02.2018
comment
@Pshemo Есть на что посмотреть. См. первую строку документа, который он цитировал. - person user207421; 10.02.2018
comment
@Pshemo - вам нравится, что ОП берет часть полного предложения и абзаца вне содержания. Вот полный контекст; Вопреки названию этого подключаемого модуля, подключаемый модуль компилятора не компилирует исходные коды вашего проекта сам по себе. Для компиляции подключаемый модуль компилятора использует другой класс для их компиляции. ПараметрcompileId определяет, какой класс будет использоваться. В настоящее время подключаемый модуль компилятора связан с артефактом компилятора javac с артефактомId plexus-compiler-javac, который можно рассматривать как одну из зависимостей, объявленных в POM подключаемого модуля компилятора. - person ; 10.02.2018