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

java eclipse maven ecj

5918 просмотра

2 ответа

6180 Репутация автора

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 Toolchain быть использован для этого?
Автор: Boris Brodski Источник Размещён: 16.10.2015 07:37

Ответы (2)


12 плюса

99067 Репутация автора

Решение

Можно изменить 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.

Автор: Tunaki Размещён: 16.10.2015 07:56

7 плюса

456 Репутация автора

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

Использовать Eclipse Compiler внутри 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, либо в раздел сборки вашего родительского / корневого модуля.

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

Maven-compiler-plugin должен быть последней версии. Исходный и целевой параметры определяют версии 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 представляет собой небольшую проблему. Возможно, вы сможете найти номер версии в списке выпусков, а затем проверить этот репозиторий maven на наличие чего-то похожего на это. Но этот репозиторий содержит только старые версии. Когда вам нужен более поздний выпуск, вы, вероятно, должны взглянуть на этот - вот где Eclipse в настоящее время продвигает свои версии, Этот новый репозиторий покончит с легко узнаваемыми номерами версий предыдущего; он использует номера версий, такие как 3.1xx, как показано выше. Eclipse обычно выпускает основной выпуск один раз в год плюс один или два выпуска исправлений между ними. Вторая часть в номере 3.13.x соответствует внутреннему управлению версиями, используемому в проекте Eclipse Platform для выпусков. Трудно получить список, но, по крайней мере, они известны:

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 командной строки, трудно понять, какие из них использовать: смотрите детали в классе Compiler.java и классах CompilerOptions.java в исходном коде Eclipse.

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

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

  • filename : определяет файл свойств, который будет передан параметру -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; добавив необходимые части в блок компиляции, вы можете запустить процессоры аннотаций. Например:

<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.

Автор: fjalvingh Размещён: 01.04.2018 03:11
Вопросы из категории :
32x32