32

私のMavenプロジェクトには、サーバー、Webなどのいくつかのモジュールがあります。

サーバーモジュールを除くすべてをJava6でビルドしたいと思います。サーバーモジュールについては、Java7でコンパイルしたいと思います。

以下に私のpom.xmlを示しますが、1.7に変更すると、すべてのモジュールがJava 7でコンパイルされると思います。また、mavenはJAVA_HOME環境変数を使用して、使用するJavaバージョンを決定しますか?

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.3.2</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
            <memmax>2048m</memmax>
        </configuration>
    </plugin>

編集また、以下の出力を行います

maven --version

Mavenが私のJavaコードを1.7でコンパイルしていることを示しますか?

vagrant@dev:~/bin/apache-tomcat-7.0.29/bin$ mvn --version
Apache Maven 3.0.4 (r1232337; 2012-01-17 08:44:56+0000)
Maven home: /home/vagrant/bin/apache-maven-3.0.4
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: /home/vagrant/bin/jdk1.7.0_07/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.2.0-23-generic", arch: "amd64", family: "unix"

ありがとう、ケビン

4

3 に答える 3

36

Mavenの実行に使用しているものとは異なるバージョンのJDKを使用してソースコードをコンパイルするためのハックがいくつかあります。たとえば、次のようなものを使用できます。

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <executable><!-- path-to-javac --></executable>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...] 
</project>

このアプローチの問題は、JDKへのパスをPOMにハードコーディングしたことです。マシン上ではすべて正常に動作しますが、HDDに障害が発生したためにマシンを再構築する必要がある場合、または別のマシンでビルドする場合は、パスが一致しない可能性が高いため、スタックします。

これを処理する正しいベストプラクティスの方法は、ツールチェーンを使用することです。これ~/.m2/toolchains.xmlにより、システム内のさまざまなツールチェーンのそれぞれがどこにあるかを説明するファイルが作成されます。次に、JDKのバージョンをMavenToolchainsプラグインで適用できます。

<plugins>
 ...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-toolchains-plugin</artifactId>
    <version>1.0</version>
    <executions> 
      <execution>
        <phase>validate</phase>
        <goals>
          <goal>toolchain</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <toolchains>
        <jdk>
          <version>1.6</version>
        </jdk>
      </toolchains>
    </configuration>
  </plugin>
  ...
</plugins>

次のことは、あなたが思うほど頻繁にこれを必要としないということです。たとえば、sourceとのtarget値を使用することで、ターゲットとするJREの正しいバイトコードを生成できます...次に発生する唯一の問題は、JRE1.7で新しいメソッドの使用です...これはMojoの動物です。 Snifferプラグインが付属しています。AnimalSnifferを使用すると、ターゲットとするJREのメソッドのみを使用できるようになります。一般的なコミュニティのコンセンサスはsourcetargetMavenコンパイラプラグイン構成の構成オプションとMojoのAnimalSnifferの使用を組み合わせることで、コンパイラ側のツールチェーンが実質的に不要になります。Surefire側では、ツールチェーンが必要です。コンパイラプラグインとツールチェーンプラグインを更新して処理する必要があるいくつかのエッジケースですが、実際には、これらのエッジケースに遭遇することはありません;-)

元の質問が完全に回答されていることを確認するためだけに(上記の質問は、質問した質問ではなく、質問したい質問に回答するため)

現在、JDK 1.7でコンパイルしています、使用しているMavenコンパイラプラグインのバージョンに応じて、でMavenコンパイラプラグインの構成を変更していない限り、どちら<source>1.4</source><target>1.4</target>かでコンパイルしている可能性があります。これにより、使用できる言語機能は決まりますが、どのクラスは使用できません...したがって、JRE 1.7で動作するコードを生成し、1.4 / 1.5以降に導入された新しいクラス/メソッドを使用していない場合(など) JRE 1.4 / 1.5でも動作するはずです...このような古いJVMで動作するかどうかを確認する唯一の方法は、古いJVMで実行するか、AnimalSnifferを使用することです。<source>1.5</source><target>1.5</target>pom.xmlString.isEmpty()

于 2012-09-14T07:04:41.877 に答える
9

Mavenツールチェーン

複数のJavaバージョンを使用するには、Mavenツールチェーンを使用する必要があります。Mavenツールチェーンでは、マシンにインストールされているすべてのJavaバージョンを含むtoolchains.xmlファイルをMavenフォルダーに作成する必要があります。~/.m2

<toolchains>
  <toolchain>
    <type>jdk</type>
    <provides>
      <id>Java13</id>
      <version>13</version>
    </provides>
    <configuration>
      <jdkHome>${env.JAVA_HOME_13}</jdkHome>
    </configuration>
  </toolchain>
  <toolchain>
    <type>jdk</type>
    <provides>
      <id>Java9</id>
      <version>9</version>
    </provides>
    <configuration>
      <jdkHome>${env.JAVA_HOME_9}</jdkHome>
    </configuration>
  </toolchain>
  <toolchain>
    <type>jdk</type>
    <provides>
      <id>Java8</id>
      <version>8</version>
    </provides>
    <configuration>
      <jdkHome>${env.JAVA_HOME_8}</jdkHome>
    </configuration>
  </toolchain>
  <toolchain>
    <type>jdk</type>
    <provides>
      <id>Java7</id>
      <version>7</version>
    </provides>
    <configuration>
      <jdkHome>${env.JAVA_HOME_7}</jdkHome>
    </configuration>
  </toolchain>
  <toolchain>
    <type>jdk</type>
    <provides>
      <id>Java6</id>
      <version>6</version>
    </provides>
    <configuration>
      <jdkHome>${env.JAVA_HOME_6}</jdkHome>
    </configuration>
  </toolchain>
</toolchains>

、、、、、環境変数はJAVA_HOME_13、関連付けられたJavaバージョンがインストールされているパスを参照するように構成されます。JAVA_HOME_9JAVA_HOME_8JAVA_HOME_7JAVA_HOME_6

FlexyPool親pom.xml構成ファイル

FlexyPoolプロジェクトの親pom.xmlMaven構成ファイルは、グローバルJavaバージョン設定を定義します

<properties>
    <jdk.version>8</jdk.version>
    ...
</properties>

次に、構成済みのJavaバージョンを使用するようにコンパイラーとテストプラグインの両方に指示する必要があります。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-toolchains-plugin</artifactId>
            <version>1.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>toolchain</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <toolchains>
                    <jdk>
                        <version>${jdk.version}</version>
                    </jdk>
                </toolchains>
            </configuration>
        </plugin>
        
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
                <source>${jdk.version}</source>
                <target>${jdk.version}</target>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
            </configuration>
        </plugin>
        
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
        </plugin>
    </plugins>
</build>

別のJavaバージョンを使用するFlexyPool子Mavenモジュールpom.xml

別のflexy-pool-core-java9Javaバージョンを必要とする子Mavenモジュールは、デフォルトのjdk.versionMavenプロパティをオーバーライドするだけで済みます。

<properties>
    <jdk.version>9</jdk.version>
</properties>

これで、実行可能なJavaの最小バージョンを使用して各モジュールを構築できます。

于 2014-09-28T07:43:20.563 に答える
3

トップpomでJDK6のセットアップを使用すると、すべてのモジュールに継承され、サーバーpom用に必要な異なる構成で上書きされます。

JDKのパスについては、指定できます。http://maven.apache.org/plugins/maven-compiler-plugin/examples/compile-using-different-jdk.htmlを参照してください。

于 2012-09-13T21:14:15.837 に答える