13

Eclipse は独自のコンパイラ (ECJ) を使用して Java コードをコンパイルします。Eclipse でコンパイルされたプログラムのデバッグは、単純なコード変更が (ホット コード置換によって) 即座に適用できるため、より簡単です。

一方、Maven は (デフォルトで) oracle JDK を使用します。これは、Eclipse デバッグ セッションでのホット コード置換を防止するさまざまなバイト コードを生成します。

したがって、プログラムをデバッグする予定がある場合は、maven ビルドで Eclipse ECJ コンパイラを使用したいと考えています。私にとって便利な方法は、「ecj」プロファイルです。

  • コンパイルリリース

    $ mvn package
    
  • ホットコード置換を有効にしてスナップショットをコンパイルする

    $ mvn -P ecj package
    

また、プロファイルのアクティブ化は、settings.xmlEclipse プロジェクトのプロパティで指定することもできます。

私の質問は次のとおりです。

  1. これは正しい方法ですか?
  2. これはどのように構成できますか?
  3. これにMavenツールチェーンを使用できますか?
4

2 に答える 2

18

javacが使用するデフォルトのコンパイラを変更することができmaven-compiler-pluginます。Eclipse コンパイラはアーティファクトにバンドルされplexus-compiler-eclipseeclipseおりcompilerIdmaven-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-compilerGitHub リポジトリで管理されています。バージョン 2.8.1は JDT の 3.11.1.v20150902-1521 をorg.eclipse.tycho:org.eclipse.jdt.core使用しますが、Plexus Compiler 依存関係の後に依存関係を追加することで独自のバージョンを使用できます。

于 2015-10-16T07:56:42.307 に答える
15

Eclipse Java コンパイラ (ecj) には、標準の javac コンパイラよりも多くの利点があります。高速で、構成可能な警告とエラーがはるかに多いため、コードの品質が向上します。コンパイラーで最も興味深い点の 1 つは、コンパイラー内に null 型が追加されたことです。コードに @Nullable および @NotNull アノテーションを付けることで、実行時ではなくコンパイル時に Eclipse コンパイラーに null アクセスをチェックさせることができます。これを厳密に適用すると、(null 値を防止することで) より安全にコードを記述できるようになり、テスト中または実稼働中の NPE 例外が防止されます。

Maven 内で Eclipse Compiler を使用することはそれほど難しくありませんが、インターネット上には多くの誤った情報や古い情報があり、多くの混乱を引き起こしています。これが問題を解決するのに役立つことを願っています。

Maven で 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>

この部分を、親/ルート pom の pluginManagement またはビルド セクションのいずれかに配置します。

それでは、さまざまな部分について説明しましょう;)

maven-compiler-plugin は最新バージョンである必要があります。source パラメータと target パラメータは、ソース コードとバイトコードに使用する Java のバージョンを定義し、通常は同じです。

引数をコンパイラに渡すのは、まったくの難破船です。以下の別のセクションを参照してください。この例では、プロパティ設定を使用して、コンパイル時に必要なエラーと警告に関する詳細な設定を提供できるようにします。パラメーター内で ${project.basedir} 変数を使用することにより、プロジェクトごとにこれらの設定を行います。すべてのプロジェクトには、.settings/org.eclipse.jdt.core.prefs ファイルが存在する必要があります (これは偶然にも場所です) Eclipse IDE はそのコンパイラー設定をそのままにします)。

plexus-codehaus-eclipse への依存関係は、Eclipse コンパイラーの実行方法を認識しているプラ​​グインを定義します。執筆時点では 2.8.3 バージョンが最新でしたが、このバージョンにはいくつかの問題があります。バージョン 2.8.4 には、多くの問題を修正するコンパイラへの書き直されたインターフェイスが付属しているはずですが、このバージョンは執筆時点ではまだ作業中です。プラグインの詳細はこちらで確認できるため、新しいリリースやコードの変更について進行状況を追跡できます。

もう 1 つの重要な依存関係は org.eclipse.jdt:ecj 依存関係です。これは、使用する ecj コンパイラの正確なバージョンを指定します。そうしないと、大きなリリースの前日にプラグインが別のバージョンのコンパイラを使用することを決定したときにビルドの安定性が損なわれるため、常に指定する必要があります;) ecj コンパイラに使用するバージョン番号は少し問題です。リリースのリストからバージョン番号を見つけて、この maven リポジトリーを調べて、それに似たものを見つけることができる場合があります。ただし、このリポジトリには古いバージョンしか含まれていません。より新しいリリースが必要な場合は、どうやらここを参照する必要があります。これは、Eclipse が現在そのバージョンをプッシュしている場所です。. この新しいリポジトリでは、以前のリポジトリの簡単に認識できるバージョン番号が廃止されています。上記のように、3.1xx のようなバージョン番号を使用します。Eclipse には通常、毎年 1 回メジャー リリースがあり、その間に 1 つまたは 2 つの修正リリースがあります。3.13.x 番号の 2 番目の部分は、リリース用の 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 が Oxygen (2017, 4.7) の場合、14 はおそらく Photon (2018, 4.8) になります。

plexus-compiler-eclipse プラグインのバージョン: 2.8.4 より前

plexus-compiler-plugin の 2.8.4 より前のバージョンでは、内部 API を使用して Eclipse コンパイラを起動していました。たとえば、この内部 API は ecj コンパイラの通常のコマンド ライン パラメータを解釈しないため、多くのことがうまく機能しません。これにより、非常に使いづらく、サポートされていないものもあります。制限事項のリストは次のとおりです。

  • 注釈処理は実装されていません。設定は黙って無視されます。

  • <compilerArguments> タグを使用して特定のパラメーターを追加することは、実装に複数の問題があるため困難です。

  • コンパイラのモジョは、ここに入力されたすべてのパラメータにダッシュを追加するようです。ただし、このバージョンのプラグインで使用される内部 API には、ダッシュのないパラメーターが必要です。そのため、プラグインはそれらを再び削除します。ここでのパラメーターは実際にはコマンド ライン ecj パラメーターではないため、どのパラメーターを使用すればよいかを判断するのは困難です。詳細については、Eclipse のソース コード内の Compiler.java クラスと CompilerOptions.java クラスを参照してください。

  • プラグインはそこでいくつかのパラメーターを受け入れますが、これらはプラグイン自体によって解釈され、内部 API に「変換」されます。

このプラグインは、 <compilerArguments>> タグで次のパラメーターを受け入れます。

  • <properties>filename</properties>: コンパイラの -properties パラメータに渡されるプロパティ ファイルを定義します。このファイルの形式の例は、Eclipse プロジェクトのファイル .settings/org.eclipse.jdt.core.prefs を見るとわかります。このファイルには、コンパイラの構成が格納されています。これには、警告、エラー、および情報メッセージの設定と、コンパイラの準拠設定が含まれています。

  • <errorsAsWarnings>何でも</errorsAsWarnings>。これが有効な場合、プラグインはコンパイラによって生成されたエラーを無視し、警告として報告します。もちろん、コンパイルはまだ失敗しているため、エラーに応じて、.class ファイルが書き込まれたり更新されたりしていない可能性があります。これはプラグイン自体によって処理されます。すべてのエラーを警告に変更し、コンパイルが機能したことを世界に伝えます。

2.8.4から

plexus-compiler-eclipse プラグインのバージョン 2.8.4 はほとんど書き直されました。ECJ コンパイラのパブリック API を使用するようになりました。これは多かれ少なかれ 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のプロジェクトのみ。

于 2018-04-01T15:11:35.350 に答える