Использование компилятора Eclipse Java (ecj) в сборках maven

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

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

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

  • сборка

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

    $ mvn -P ecj package
    

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

мои вопросы:

  1. это правильный путь?
  2. как это можно настроить?
  3. Can Maven toolchain будет использоваться для этого?

2 ответов


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

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

<profile>
  <id>ecj</id>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.0</version>
        <configuration>
          <compilerId>eclipse</compilerId>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-compiler-eclipse</artifactId>
            <version>2.8.1</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</profile>

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


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

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

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

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <compilerId>eclipse</compilerId>
                <source>${source.jdk.version}</source>
                <target>${target.jdk.version}</target>
                <!-- Passing arguments is a trainwreck, see https://issues.apache.org/jira/browse/MCOMPILER-123 -->
                <compilerArguments>
                    <properties>${project.basedir}/.settings/org.eclipse.jdt.core.prefs</properties>
                </compilerArguments>
                <showWarnings>true</showWarnings>
                <showDeprecation>true</showDeprecation>
            </configuration>

            <dependencies>
                <dependency>
                    <groupId>org.codehaus.plexus</groupId>
                    <artifactId>plexus-compiler-eclipse</artifactId>
                    <version>2.8.3</version>
                </dependency>

                <dependency>
                    <groupId>org.eclipse.jdt</groupId>
                    <artifactId>ecj</artifactId>
                    <version>3.13.101</version>
                </dependency>
            </dependencies>
        </plugin>
</pluginManagement>

поместите эту часть в раздел pluginManagement или build вашего родительского/корневого pom.

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

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

передача аргументов компилятору является полным trainwreck. Увидеть отдельный раздел об этом ниже. В этом примере я использую параметр свойства, который позволяет мне предоставить подробные настройки, на которых ошибки и предупреждения я хочу иметь при компиляции вещей. С помощью ${проект.basedir} переменная внутри параметра у меня есть эти настройки для каждого проекта :каждый проект должен иметь.настройки/орг.затмение.JDT, предназначенным.ядро.присутствует файл prefs (который по счастливой случайности является местом, где Eclipse IDE оставляет свои настройки компилятора).

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

другой важной зависимостью является организация.затмение.JDT: ECJ зависимость: этот указывает точная версия компилятора ecj для использования. Вы всегда должны указывать его, потому что в противном случае стабильность сборки пострадает, когда плагин решит использовать другую версию компилятора за день до того, как у вас будет большой выпуск ;) номер версии для компилятора ecj-это немного проблема. Возможно, вы сможете найти номер версии из список релизов и потом проверить это хранилище maven Для что-то похожее. Но этот репозиторий содержит только старые версии. Когда вам нужен более поздний выпуск, вы должны, по-видимому,посмотрите сюда на этот - вот где затмение в настоящее время выдвигает свои версии. Этот новый репозиторий устраняет легко узнаваемые номера версий предыдущего; он использует номера версий, такие как 3.1 x.x как показано выше. Eclipse обычно имеет крупный выпуск один раз в год плюс один или два выпуска fix между ними. Вторая часть в 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, вероятно, будет фотоном (2018, 4.8).

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

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

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

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

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

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

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

  • filename: определяет файл свойств, который будет передан параметру-properties компилятора. Примеры формата этого файла можно найти, посмотрев на файл .настройки/орг.затмение.JDT, предназначенным.ядро.префы в проекте Eclipse: в этом файле хранится конфигурация компилятора. Он содержит параметры предупреждений, ошибок и информационных сообщений, а также параметры соответствия компилятора.

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

от 2.8.4

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

как и в предыдущей версии, эта версия также требует удаления " - " из всех имен параметров; тире автоматически добавляется снова перед имя параметра добавляется в командную строку ЕСС.

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${maven-compiler-plugin.version}</version>
    <configuration>
        <annotationProcessors>
            <annotationProcessor>db.annotationprocessing.EntityAnnotationProcessor</annotationProcessor>
        </annotationProcessors>
        <annotationProcessorPaths>
            <dependency>
                <groupId>to.etc.domui</groupId>
                <artifactId>property-annotations-processor</artifactId>
                <version>1.2-SNAPSHOT</version>
            </dependency>
        </annotationProcessorPaths>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>to.etc.domui</groupId>
            <artifactId>property-annotations-processor</artifactId>
            <version>1.2-SNAPSHOT</version>
        </dependency>
    </dependencies>
</plugin>

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