Specify JDK for Maven to use
Asked Answered
O

15

192

I am trying to build a Hudson plugin I've modified and it requires jdk1.6. This is fine, but I don't see how I can tell maven where the different jdk is. I've found few mentions on the internet but they don't seem to apply to me. Some suggest adding some config to .m2/settings.xml but I don't have a settings.xml. Plus, I don't want to use 1.6 for all maven builds.

One kink is I am using mvn in cygwin, if that matters at all. It appears I should be able to make the specification in the project pom file, but the existing pom is pretty bare.

So bottom line is, is there a way to specify a jdk for a single invocation of maven?

Ontology answered 23/3, 2010 at 21:11 Comment(1)
IntelliJ-specific answer: #25888523Chef
R
196

So bottom line is, is there a way to specify a jdk for a single invocation of maven?

Temporarily change the value of your JAVA_HOME environment variable.

Rimose answered 23/3, 2010 at 21:15 Comment(11)
Example in windows: set JAVA_HOME="C:\Java\jdk7"Cerallua
in lubuntu: JAVA_HOME="/home/desa/programas/jdks/jdk1.6.0_45/" mvn -vFosdick
And in case anyone else forgets and spends ages wondering why they can't change it: JAVA_HOME can be set for Maven (on Mac at least) in this file: /private/etc/mavenrc - And that can use something like (note the backticks not single quotes!): export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75` Quaternion
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre' (works for me)Delicatessen
I appreciate @Cerber's answer below, but in the end, this is just simpler and avoids any more subtle errors. It also mimicks the way CI servers like Jenkins essentially do it.Thermograph
if I change JAVA_HOME and then I do java -version, it still prints the previous version.Lavelle
Based on this answer I run the following before executing maven: export JAVA_HOME=`java -XshowSettings:properties -version 2>&1 | grep java.home | awk '{ print $3; }'`Portal
To change JAVA_HOME for a single invocation without having to reset it, use JAVA_HOME="C:\Program Files\jdk-13.0.2" mvn --versionContradiction
How to force Maven to run itself using JDK 11 and build project using JDK 1.5 ?Recreant
@Lavelle That's because when you run java -version your shell is looking up the location of the java program in your PATH environment variable. Maven, on the other hand, is looking up where your JRE is via the JAVA_HOME environment variable.Crystallite
For me, mvn did not work until I changed PATH variable to point to desired JDK bin.Beth
M
107

Seems that maven now gives a solution here : Compiling Sources Using A Different JDK

Let's say your JAVA_HOME points to JDK7 (which will run maven processes)

Your pom.xml could be :

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

If your developpers just add (and customize) the following lines in their settings.xml, your pom will be platform independant :

<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>
Matutinal answered 26/12, 2013 at 15:38 Comment(5)
Voted up! I found I can use -Dmaven.compiler.fork=true and -Dmaven.compiler.executable=/path/to/target/javac in command line.Hematology
even using those java-opts, you still must add this to the compiler plugin <executable>${maven.compiler.executable}</executable>Party
@JinKwon Passing options with -D works fine, even without defining it in the compiler plugin section. This is nice for occasional use or for scripting. You should put it in a separate answer so we can vote it up!Latoria
This solution failed when I try to run tests in Java 8 I was getting *Unsupported major.minor version 52.0 *Allure
I was hoping to be able to use the same method to generate the JAR file using the maven-jar-plugin but it looks like it is not supported. The only method to generate JAR using a specific JDK is by setting PATH and JAVA_HOME. Any other method you are aware of?Patterman
H
59

compile:compile has a user property that allows you to specify a path to the javac.

Note that this user property only works when fork is true which is false by default.

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

You might have to double quote the value if it contains spaces.

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

See also Maven custom properties precedence.

Hematology answered 15/4, 2016 at 12:27 Comment(1)
I've also needed to overwrite my JAVA_HOME variable. For example (in bash shell): 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:runRandy
F
23

As u said "Plus, I don't want to use 1.6 for all maven builds."....So better I will say modify your pom file and specify which jdk version to use.

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

It will ensure that your particular project uses that version of jdk.

Fatwitted answered 24/8, 2013 at 16:3 Comment(2)
This is just the starting point, but not the solution. This is the requirement for the maven compiler plugin to compile for 1.7. And then the trick is to make maven really capable of compiling for 1.7, which is not so trivial if your current java version is different...Mime
That is other question #16724033Erny
M
18

I say you setup the JAVA_HOME environment variable like Pascal is saying: In Cygwin if you use bash as your shell should be:

export JAVA_HOME=/cygdrive/c/pathtothejdk

It never harms to also prepend the java bin directory path to the PATH environment variable with:

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

Also add maven-enforce-plugin to make sure the right JDK is used. This is a good practice for your pom.

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

Please, see Maven Enforcer plugin – Usage.

Monasticism answered 24/3, 2010 at 4:37 Comment(1)
This was perfect for specifying the exact version of the JDK. For example, I have a project that fails when using the initial JDK 1.8, but if using JDK 1.8.0_77, it works just fine. I had both JDKs installed, and with this solution maven told me I was using the wrong version of 1.8 until I changed my JAVA_HOME path to target the specific 1.8.0_77 folder. The other answers did not allow you to be so granular on the version.Blackjack
T
18

If you have installed Java through brew in Mac then chances are you will find your Java Home Directory here:

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

The next step now would be to find which Java Home directory maven is pointing to. To find it type in the command:
mvn -version

enter image description here

The fields we are interested in here is: Java version and runtime.

Maven is currently pointing to Java 13. Also, you can see the Java Home path under the key runtime, which is:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

To change the Java version of the maven, we need to add the Java 8 home path to the JAVA_HOME env variable.

To do that we need to run the command:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home in the terminal.

Now if we check the maven version, we can see that it is pointing to Java 8 now.

enter image description here

The problem with this is if you check the maven version again in the new terminal, you will find that it is pointing to the Java 13. To avoid this I would suggest adding the JAVA_HOME variable in the ~/.profile file.

This way whenever your terminal is loading it will take up the value you defined in the JAVA_HOME by default. This is the line you need to add in the ~/.profile file:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

You can open up a new terminal and check the Maven version, (mvn -version) and you will find it is pointing to the Java 8 this time.

Titanium answered 12/5, 2020 at 12:38 Comment(2)
I was checking by Bash profile and maven but both have different JAVA Versions. My JAVA_HOME looks: JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home My Maven reads the runtime as – /Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/HomeMariannamarianne
One more thing. I tried to change JAVA_HOME, but despite doing so, the command (mvn -version) kept telling me that I had Java 13. What I did was set a wrong path in JAVA_HOME (with and error inside the path), and then the correct one. This caused the Java path to be nulled and then it was refreshed in Maven.Prefect
P
13

I know its an old thread. But I was having some issues with something similar to this in Maven for Java 8 compiler source. I figured this out with a quick fix mentioned in this article thought I can put it here and maybe can help others:

<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>
Protuberance answered 12/1, 2017 at 3:53 Comment(2)
A Maven Update might be required after adding these lines (Eclipse: Right click on the project, Maven, Update project)Procambium
Setting maven.compiler properties doesn't prevent the code from using methods added in java 11. For instances String.repeat(). This when building with jdk 11. So the maven builds but I wish it would failDuplessismornay
L
7

Maven uses variable $JAVACMD as the final java command, set it to where the java executable is will switch maven to different JDK.

Lal answered 30/8, 2013 at 6:14 Comment(0)
F
7

You could also set the JDK for Maven in a file in your home directory ~/.mavenrc:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'

This environment variable will be checked by the mvn script and used when present:

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

https://github.com/CodeFX-org/mvn-java-9/tree/master/mavenrc

Flatboat answered 20/4, 2020 at 17:10 Comment(2)
Highly underrated comment, with this I was able to persistently set the JAVA_HOME version in RHEL 8Ref
Also worked perfectly on MacOS 12.4 with latest and version 11 of openjdk installed through homebrewMandeville
K
3

Hudson also allows you to define several Java runtimes, and let you invoke Maven with one of these. Have a closer look on the configuration page.

Knockabout answered 23/3, 2010 at 22:6 Comment(1)
The OP is building an hudson plugin on the command line, not under hudson (at least, this is my understanding).Rimose
B
3

Yet another alternative to manage multiple jdk versions is jEnv

After installation, you can simply change java version "locally" i.e. for a specific project directory by:

jenv local 1.6

This will also make mvn use that version locally, when you enable the mvn plugin:

jenv enable-plugin maven
Bowleg answered 20/12, 2019 at 11:12 Comment(1)
Thanks for the jenv maven recommendation.Recurved
G
3

I update my ~/.m2/settings.xml

<settings>
  <profiles>
        <profile>
            <id>j8</id>
            <profile>
            <id>j8</id>
            <properties>
                <maven.compiler.fork>true</maven.compiler.fork>
                <maven.compiler.executable>${env.JAVA_HOME8}/bin/javac.exe</maven.compiler.executable>
            </properties>
        </profile>
        <profile>
            <id>j11</id>
            <properties>
                <maven.compiler.fork>true</maven.compiler.fork>
                <maven.compiler.executable>${env.JAVA_HOME11}/bin/javac.exe</maven.compiler.executable>
            </properties>
        </profile>
  </profiles>
<settings>

For build with Java8 I run mvn with properties:

mvn compile -Pj8

and for Java 11

mvn compile -Pj11
Gertiegertrud answered 26/10, 2022 at 17:12 Comment(0)
W
2

If nothing else works and even after you set JAVA_HOME to a correct path, check if there is no override of the JAVA_HOME path in <user>/.mavenrc!

As a further tip, the mvn file is a bash script (on Linux).. so if necessary you can inspect the source [and change it].

Wobbling answered 20/10, 2021 at 18:53 Comment(0)
O
0

I had build problem with maven within Eclipse on Windows 7.

Though I observed mvn build was running just fine from command line.

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

Eclipse was considering as default JVM a JRE installation instead of JDK so it was failing on compilation.

I added to eclipse.ini following line:

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

Also when starting from eclipse I used in "Goals" section following list:

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

Compilation error got solved.

Opsonin answered 9/3, 2016 at 17:58 Comment(0)
M
0

For 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>
Mellette answered 1/11, 2017 at 13:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.