Использование Eclipse Java Compiler (ecj) в maven builds

Eclipse использует собственный компилятор (ECJ) для компиляции кода Java. Отладка программы, скомпилированной с помощью Eclipse, проще, потому что простые изменения кода могут быть применены мгновенно (путем замены горячего кода).

Maven, с другой стороны, использует (по умолчанию) oracle JDK, который генерирует разные байтовые коды, предотвращающие замену горячего кода в сеансе отладки Eclipse.

Поэтому я хотел бы использовать компилятор Eclipse ECJ с моей сборкой maven, если планирую отладить программу. Удобным способом для меня был бы профиль «ecj»:

  • Скомпилировать выпуск

    $ mvn package 
  • Компиляция моментального снимка с включенной заменой горячего кода

     $ mvn -P ecj package 

Также активация профиля может быть указана в settings.xml или даже в проекте Eclipse.

Мои вопросы:

  1. Это правильный путь?
  2. Как это можно настроить?
  3. Можно ли использовать для этого средство привязки maven?

Можно изменить компилятор javac по умолчанию, который используется maven-compiler-plugin . Компилятор Eclipse связан с артефактом plexus-compiler-eclipse и он объявляется установкой eclipse в атрибут maven-compiler-plugin .

Если вы хотите активировать это изменение для настраиваемого профиля , вы можете иметь следующую конфигурацию:

  ecj    maven-compiler-plugin 3.6.0  eclipse    org.codehaus.plexus plexus-compiler-eclipse 2.8.1       

Плагин поддерживается в хранилище репозитория plexus-compiler GitHub . Версия 2.8.1 использует 3.11.1.v20150902-1521 JDT , хотя вы можете использовать свою собственную версию, добавив зависимость от org.eclipse.tycho:org.eclipse.jdt.core после зависимости от компилятора Plexus.

Компилятор Java Eclipse (ecj) имеет множество преимуществ перед стандартным компилятором javac. Это быстро, и у него есть больше предупреждений и ошибок, которые можно настроить, улучшая качество кода. Одной из наиболее интересных вещей в компиляторе является добавление нулевых типов внутри компилятора : аннотируя свой код с помощью @Nullable и @NotNull-аннотаций, вы можете заставить компилятор Eclipse проверять нулевые обращения во время компиляции, а не во время выполнения. При строгом применении это обуславливает более безопасный код (путем предотвращения нулевых значений) и предотвращает исключения NPE во время тестирования или производства.

Использовать компилятор Eclipse внутри Maven не слишком сложно, но есть много дезинформации и старой информации о Интернетах, что вызывает много путаницы. Надеюсь, это поможет установить все прямо.

Чтобы заставить Eclipse использовать компилятор ecj, вам нужно использовать плагин plexus-compiler-eclipse и ничего больше. Типичная конфигурация будет следующей:

    org.apache.maven.plugins maven-dependency-plugin   org.apache.maven.plugins maven-compiler-plugin 3.7.0  eclipse ${source.jdk.version} ${target.jdk.version}   ${project.basedir}/.settings/org.eclipse.jdt.core.prefs  true true    org.codehaus.plexus plexus-compiler-eclipse 2.8.3   org.eclipse.jdt ecj 3.13.101     

Поместите эту часть либо в pluginManagement, либо в секцию сборки вашего родительского / корневого пом.

Теперь давайте объясним разные части;)

Плагин maven-compiler должен иметь последнюю версию. Исходные и целевые параметры определяют версии java для использования для исходного кода и байт-кода и обычно являются одинаковыми.

Передача аргументов компилятору – это полная поездка. См. Отдельный раздел ниже. В этом примере я использую параметр свойств, который позволяет мне предоставлять подробные настройки, по которым я хочу иметь ошибки и предупреждения при компиляции. Используя переменную $ {project.basedir} внутри параметра, у меня есть эти настройки для каждого проекта: для каждого проекта требуется наличие файла .settings / org.eclipse.jdt.core.prefs (который по счастливой случайности является местом, где Eclipse IDE оставляет свои настройки компилятора).

Зависимость от plexus-codehaus-eclipse определяет плагин, который знает, как запустить компилятор Eclipse. Версия 2.8.3 была самой последней на момент написания, но в этой версии несколько проблем. Версия 2.8.4 должна содержать переписанный интерфейс для компилятора, который исправляет множество проблем, но эта версия все еще работает на момент написания. Здесь вы можете найти подробную информацию о плагине , чтобы можно было следить за новыми версиями / изменениями кода.

Другая важная зависимость – это зависимость org.eclipse.jdt: ecj: она определяет точную версию компилятора ecj для использования . Вы всегда должны указывать его, потому что в противном случае стабильность сборки будет страдать, когда плагин решит использовать другую версию компилятора за один день до того, как у вас будет большой выпуск;) Номер версии, используемой для компилятора ecj, является проблемой. Вы можете найти номер версии из списка выпусков, а затем проверить этот repository maven на то, что похоже на него. Но этот repository содержит только старые версии. Когда вам нужен более поздний выпуск, вы должны, по-видимому, посмотреть здесь, на этот раз – вот где Eclipse в настоящее время подталкивает свои версии . Этот новый repository устраняет легко узнаваемые номера версий предыдущего; он использует номера версий, такие как 3.1xx, как показано выше. Eclipse обычно выпускает основной релиз один раз в год плюс один или два релиза обновлений между ними. Вторая часть в номере 3.13.x соответствует внутреннему версированию, используемому в проекте платформы Eclipse для релизов. Трудно попасть по списку, но, по крайней мере, они известны:

 Version Eclipse Release Compiler Version 3.13.0 Oxygen Release 4.7 3.13.50 Oxygen 1a 4.7.1a 3.13.100 Oxygen R2 4.7.2 

Версия всегда начинается с 3, 13 – это более или менее «год» выпуска. Поэтому, когда 13 является кислородом (2017, 4,7), 14, вероятно, будет Photon (2018, 4.8).

Версии плагина plexus-compiler-eclipse: до 2.8.4

Версии до 2.8.4 плагина plexus-compiler использовали внутренний API для запуска компилятора Eclipse. Это приводит к тому, что многие вещи не работают так хорошо, поскольку этот внутренний API, например, не интерпретирует обычные параметры командной строки для компилятора ecj. Это делает его довольно сложным в использовании, и некоторые вещи не поддерживаются. Ниже приведен список ограничений:

  • Обработка аннотаций не выполняется. Любая конфигурация молча игнорируется.

  • Добавление определенных параметров с помощью тега затруднено, так как в реализации есть несколько проблем:

  • Компилятор mojo, кажется, добавляет тире ко всем параметрам, введенным здесь. Однако внутренний API, используемый этой версией плагина, нуждается в параметрах без тире. Поэтому плагин удаляет их снова. Поскольку параметры здесь не являются действительно параметрами командной строки ecj, трудно понять, какие из них использовать: посмотрите сведения о classах Compiler.java и CompilerOptions.java в исходном коде Eclipse.

  • Плагин принимает некоторые параметры там, но они интерпретируются самим плагином, а затем «переводится» во внутренний api.

Этот плагин принимает следующие параметры в теге >:

  • <свойства> имя_файла : определяет файл свойств, который будет передан параметру -properties компилятора. Примеры формата этого файла можно найти, посмотрев файл .settings / org.eclipse.jdt.core.prefs в проекте Eclipse: этот файл хранит конфигурацию компилятора. Он содержит параметры предупреждений, ошибок и информационных сообщений, а также параметры соответствия компилятора.

  • любой . Когда это будет правильно, плагин проигнорирует любую ошибку, которая генерируется компилятором и сообщит о них как предупреждения. Конечно, компиляция все еще не удалась, поэтому в зависимости от ошибки файл .class мог быть написан / обновлен или нет. Этот процесс обрабатывается самим плагином: он просто изменяет все ошибки на предупреждения и сообщает миру, что компиляция работает.

Из пункта 2.8.4

Версия 2.8.4 плагина plexus-compiler-eclipse была в основном переписана. Теперь он использует открытый API компилятора ECJ, который более или менее является компилятором ECJ. Это, например, означает, что все, что может сделать ECJ (например, обработка аннотаций), теперь может сделать плагин, а параметры, введенные в тег, теперь передаются компилятору, что означает, что вы должны использовать страницу справки ecj, чтобы узнать интересные параметры для добавления.

Как и предыдущая версия, эта версия также требует, чтобы вы удаляли «-» из всех имен параметров; черта автоматически добавляется до того, как имя параметра добавляется в командную строку ecj.

Эта версия поддерживает обработку аннотаций, как определено Maven; добавив необходимые части в компиляцию blob, вы можете запустить свои обработчики annotations. Например:

  org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin.version}   db.annotationprocessing.EntityAnnotationProcessor    to.etc.domui property-annotations-processor 1.2-SNAPSHOT      to.etc.domui property-annotations-processor 1.2-SNAPSHOT    

Эта часть может показаться неполной, потому что вообще нет ссылки на плагин plexus-compiler-eclipse, но помните, что в Maven, который конфигурация наследует: родительский POM в этом случае содержит указанную выше часть, и это просто добавляет немного конфигурации для этот проект только POM.

  • В этой среде компилятор не предоставляется. Возможно, вы работаете на JRE, а не на JDK?
  • Как настроить мультимодульный Maven + Sonar + JaCoCo для предоставления объединенного отчета о покрытии?
  • wildfly 10: java.lang.ClassCastException: org.dom4j.DocumentFactory не может быть передан в org.dom4j.DocumentFactory
  • CDI: beans.xml, где я могу поставить вас?
  • Предупреждение VM на 64-битном сервере Java HotSpot (TM): игнорирование опции MaxPermSize
  • Как сообщить Spring Boot, какой основной class использовать для исполняемого банку?
  • запустить основной class проекта Maven
  • отключить выполнение: default-jar
  • Почему Maven загружает maven-metadata.xml каждый раз?
  • Удаление или удаление файлов ресурсов из целевого каталога с помощью файла pom
  • Почему я получаю «Полученное фатальное предупреждение: протокол_версии» или «не проверено подлинностью» от Maven Central?
  • Interesting Posts
    Давайте будем гением компьютера.