Mavenが使用するJDKを指定する


141

私が変更したHudsonプラグインをビルドしようとしていますが、jdk1.6が必要です。これは問題ありませんが、異なるjdkがどこにあるかをmavenに伝える方法がわかりません。私はインターネットでいくつかの言及を見つけましたが、それらは私には当てはまらないようです。いくつかの設定を追加することを提案する人も.m2/settings.xmlいますが、私は持っていませんsettings.xml。さらに、すべてのMavenビルドに1.6を使用したくありません。

mvnそれが重要であれば、1つのキンクはcygwinで使用しています。プロジェクトのpomファイルで仕様を作成できるように見えますが、既存のpomはかなり裸です。

つまり、mavenの1回の呼び出しに対してjdkを指定する方法はありますか?

回答:


142

つまり、mavenの1回の呼び出しに対してjdkを指定する方法はありますか?

JAVA_HOME環境変数の値を一時的に変更します。


10
Windowsでの例:set JAVA_HOME="C:\Java\jdk7"
acdcjunior

6
lubuntuの場合:JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique SanMartínMar

8
そして、なぜ誰かがそれを変更できないのか疑問に思って年齢を忘れて費やしている場合はJAVA_HOME、このファイルでMaven(少なくともMacの場合)に設定/private/etc/mavenrc できます。export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti 2015年

3
Unix:(export JAVA_HOME='D:/dev/java/jdk8/jre'私にとってはうまくいく)
Christophe Roussy

2
JAVA_HOMEを変更してからを変更しjava -versionても、以前のバージョンが印刷されます。
ocramot

82

mavenがここで解決策を提供しているようです:異なるJDKを使用したソースのコンパイル

JAVA_HOMEJDK7(これはMavenプロセスを実行します)を指しているとしましょう

あなたのpom.xml可能性があります:

<build>
    <plugins>
        <!-- we want JDK 1.6 source and binary compatiblility -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <!-- ... -->
        <!-- we want sources to be processed by a specific 1.6 javac -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <verbose>true</verbose>
              <fork>true</fork>
              <executable>${JAVA_1_6_HOME}/bin/javac</executable>
              <compilerVersion>1.3</compilerVersion>
            </configuration>
        </plugin>
    </plugins>
</build>

開発者がに次の行を追加(およびカスタマイズ)するだけの場合、settings.xmlpomはプラットフォームに依存しなくなります。

<settings>
  [...]
  <profiles>
    [...]
    <profile>
      <id>compiler</id>
        <properties>
          <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
          <JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME>
        </properties>
    </profile>
  </profiles>
  [...]
  <activeProfiles>
    <activeProfile>compiler</activeProfile>
  </activeProfiles>
</settings>

18
投票しました!コマンドラインで-Dmaven.compiler.fork=trueand -Dmaven.compiler.executable=/path/to/target/javacを使用できることがわかりました。
Jin Kwon

これらのjava-optsを使用する場合でも、これをコンパイラプラグイン<executable> $ {maven.compiler.executable} </ executable>に追加する必要があります
Paul Gregoire

2
@JinKwon -Dでのオプションの受け渡しは、コンパイラプラグインセクションで定義しなくても正常に機能します。これは、時折の使用やスクリプト作成に適しています。投票できるように、別の回答に入れてください。
ガエタン・レーマン

Java 8でテストを実行しようとすると、このソリューションは失敗しました*サポートされていないmajor.minorバージョン52.0 *
edwin

39

compile:compileにへのパスを指定できるユーザープロパティがありますjavac

このユーザープロパティは、デフォルトのforkisでtrueある場合にのみ機能することに注意してくださいfalse

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile

スペースが含まれている場合は、値を二重引用符で囲む必要がある場合があります。

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile

Mavenカスタムプロパティの優先順位も参照してください。


JAVA_HOME変数を上書きする必要もあります。例(bashシェルの場合):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
Enrique S. Filiage

24

uが言ったように、「すべてのMavenビルドに1.6を使用する必要はありません。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.9</source>
                <target>1.9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

これにより、特定のプロジェクトがそのバージョンのjdkを使用するようになります。


6
これは単なる出発点であり、解決策ではありません。これは、1.7用にコンパイルするためのMavenコンパイラプラグインの要件です。そして秘訣は、Mavenを1.7用にコンパイルできるようにすることです。これは、現在のJavaバージョンが異なる場合はそれほど簡単ではありません...
Sergey Ushakov


14

JAVA_HOMEPascalが言っているような環境変数を設定すると私は言います:Cygwinでは、シェルとしてbashを使用する場合:

export JAVA_HOME=/cygdrive/c/pathtothejdk

環境変数へのjava ディレクトリパスの前に次を追加しても害はありません。binPATH

export PATH=${JAVA_HOME}/bin:${PATH}

またmaven-enforce-plugin、適切なJDKが使用されていることを確認するために追加します。これはあなたのポンにとって良い習慣です。

<build>
 <plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-enforcer-plugin</artifactId>
      <executions>
        <execution>
          <id>enforce-versions</id>
          <goals>
            <goal>enforce</goal>
          </goals>
          <configuration>
            <rules>
              <requireJavaVersion>
                <version>1.6</version>
              </requireJavaVersion>
            </rules>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Maven Enforcer plugin – Usageを参照してください。


1
これは、JDKの正確なバージョンを指定するのに最適でした。たとえば、最初のJDK 1.8を使用すると失敗するプロジェクトがありますが、JDK 1.8.0_77を使用している場合は問題なく動作します。両方のJDKをインストールしましたが、このソリューションでは、JAVA_HOMEパスを変更して特定の1.8.0_77フォルダーをターゲットにするまで、間違ったバージョンの1.8を使用しているとmavenから言われました。他の回答では、バージョンを細かくすることはできませんでした。
bojingo 2016年

13

私はその古い糸を知っています。しかし、私はMaven for Java 8コンパイラソースでこれに似た問題をいくつか抱えていました。私はこれをここに置くことができ、おそらく他の人を助けることができると思ったこの記事で言及されたクイックフィックスでこれを理解しました:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

1
これらの行を追加した後、Maven Updateが必要になる場合があります(Eclipse:プロジェクトを右クリックして、Maven、Updateプロジェクト)
Romano

maven.compilerプロパティを設定しても、コードがJava 11で追加されたメソッドを使用できなくなることはありません。たとえば、String.repeat()などです。これはjdk 11でビルドする場合
です。Maven

6

Mavenは変数$ JAVACMDを最後のjavaコマンドとして使用し、java実行可能ファイルがmavenを別のJDKに切り替える場所に設定します。


バディに感謝します。10時間過ごした後、回答を参考に修正しました。
Mukul_3062

3

Hudsonでは、いくつかのJavaランタイムを定義して、これらの1つでMavenを呼び出すこともできます。設定ページをよく見てください。


OPはhudsonの下ではなく、コマンドラインでhudsonプラグインを構築しています(少なくとも、これは私の理解です)。
Pascal Thivent 2010年

3

あなたが経由でJavaをインストールしている場合brewMac、次にチャンスはあなたがここにあなたのJavaのホームディレクトリを見つけます、次のとおりです。

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

次のステップは、Java Homemavenが指しているディレクトリーを見つけることです。それを見つけるには、次のコマンドを入力します。
mvn -version

ここに画像の説明を入力してください

ここで関心のあるフィールドは Java version、とruntimeです。

Mavenは現在を指していJava 13ます。また、主要なランタイムの下にJavaホームパスが表示されます。つまり、次のとおりです
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

。MavenのJavaバージョンを変更するには、Java 8ホームパスをJAVA_HOMEenv変数に追加する必要があります。

そのためには
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home 、ターミナルでコマンドを実行する必要があります。

mavenのバージョンを確認すると、Java 8を指していることがわかります。

ここに画像の説明を入力してください

この問題は、新しいターミナルでMavenのバージョンをもう一度確認すると、Java 13を指していることがわかります。これを回避するにはJAVA_HOME~/.profileファイルに変数を追加することをお勧めします。

このようにして、端末がロードされるときはいつでも、デフォルトでJAVA_HOMEで定義した値を使用します。これは、~/.profileファイルに追加する必要がある行です。
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

新しいターミナルを開いてMavenのバージョン(mvn -version)を確認すると、今回はJava 8を指していることがわかります。


0

Windows 7のEclipse内でmavenのビルドに問題がありました。

コマンドラインからmvn buildが問題なく実行されていることを確認しましたが。

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml   > output.log

Eclipseは、JDKではなくJREインストールをデフォルトのJVMと見なしていたため、コンパイルに失敗していました。

次の行をeclipse.iniに追加しました。

-vm
C:\Program Files (x86)\Java\jdk1.8.0_25\bin

また、日食から始めるとき、私は「目標」セクションの次のリストで使用しました:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml

コンパイルエラーが解決しました。


0

Java 9の場合:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

0

複数のjdkバージョンを管理するためのさらに別の方法はjEnvです

インストール後、Javaのバージョンを「ローカル」に、つまり特定のプロジェクトディレクトリに変更するには、次のようにします。

jenv local 1.6

これにより、mvnプラグインを有効にすると、mvnがローカルでそのバージョンを使用するようになります。

jenv enable-plugin maven

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.