DanInDC
DanInDC

Reputation: 5179

Specify JDK for Maven to use

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?

Upvotes: 194

Views: 450230

Answers (16)

CAMD_3441
CAMD_3441

Reputation: 3154

Related to the approved answer above https://stackoverflow.com/a/2503679/4722577

You can edit the JAVA_HOME environment variable on your PC. But in windows its a pain to have to restart your machine for the change to take hold.

Alternatively you can set the JAVA_HOME in your mvn script/command file.

Go to your maven directory and open the windows specific mvn command.

In older instances its mvn.bat, on newer ones its mvn.cmd

Near the top add this line:

@REM Set this value to any other JDK path you have installed
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45

Now every time you use maven to build your project it will use this jdk.

Upvotes: 0

DevCoder
DevCoder

Reputation: 536

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

Upvotes: 23

Cerber
Cerber

Reputation: 2939

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 developers just add (and customize) the following lines in their settings.xml, your pom.xml will be platform independent:

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

Upvotes: 108

Alexey Shmakov
Alexey Shmakov

Reputation: 31

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

Upvotes: 3

JohnTortugo
JohnTortugo

Reputation: 6625

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

Upvotes: 2

Rito
Rito

Reputation: 3290

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.

Upvotes: 18

Pascal Thivent
Pascal Thivent

Reputation: 570285

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.

Upvotes: 196

feniix
feniix

Reputation: 1628

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.

Upvotes: 18

Spindizzy
Spindizzy

Reputation: 8924

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

Upvotes: 9

Ahmad Abdelghany
Ahmad Abdelghany

Reputation: 13198

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

Upvotes: 3

Jin Kwon
Jin Kwon

Reputation: 21976

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.

Upvotes: 61

Jobanpreet Singh
Jobanpreet Singh

Reputation: 75

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>

Upvotes: 0

Parth Joshi
Parth Joshi

Reputation: 462

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>

Upvotes: 13

aprodan
aprodan

Reputation: 569

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.

Upvotes: 0

Lin Gao
Lin Gao

Reputation: 79

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

Upvotes: 7

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.

Upvotes: 3

Related Questions