How to Set Specific Java Version for Maven in Windows?

Maven is a great build tool and most of the Java developer uses Maven to build their projects, but like any other tool, there are some intricacies which you need to know while using it. One of them is that Maven uses Java version from the JAVA_HOME environment variable and not the PATH environment variable. If you have multiple JDK installed on your machine and getting an Unsupported major.minor version 51.0 or Unsupported major.minor version 52.0 error while building your project but have right Java version in PATH then you may need to check the JAVA_HOME and update it. If you don't have access to do it then you can still change JAVA_HOME using set command in your local shell and run the Maven's mvn command to build the project

This change will not affect the entire machine and go away as soon as you close the shell. I'll tell you how to that in this article.

Recently I got a chance to work with QuickFIXJ, an open source library to parse and process FIX messages. If you don't know the FIX, it stands for Financial Information Exchange protocol and is used heavily for Electronic trading. If you are interested, you can learn more about the FIX in my series of FIX tutorials.

I had a requirement to add a custom FIX tag to parse incoming message and for that, I need to extend the FIX dictionary of QuickFIXJ (like a FIX44.xml file) and build the JAR file. In order to do that I cloned the latest release of QuickFIX from GitHub and started building using Maven, only for the build to be failed.

I was getting "org/apache/maven/plugins/resources/ResourcesMojo : Unsupported major.minor version 51.0" error which means Maven is using JDK 1.6 or lower to build the project but the project needed Java 1.7 (See my article on UnsupportedClassVersion to learn more).

I was surprised by this error because I was sure that I am using Java 1.8, which should be enough to build the project. To confirm that I run following command in the command line window I was using to run Maven:

$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b32)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b32, mixed mode)


And it was declaring the correct Java version. Then I realized that when you type java on command prompt it pick the JDK version from the PATH environment variable but Maven uses JAVA_HOME environment variable to pick the JDK version to build your project and run it's a plugin.

To confirm the JAVA_HOME, I checked the environment variable using "env" shell command on Windows and boom, it was pointing to JDK 1.6 which explains the error.

The solution was now easy, I just updated JAVA_HOME and it worked fine. So, just remember that Maven doesn't use PATH to pick the Java version, instead, it uses JAVA_HOME variable.

If you are getting the Unsupported major.minor version 51.0 or Unsupported major.minor version 52.0 error while building your project or any open source project using Maven, please check the JAVA_HOME environment variable in your machine and change it to JDK 1.7 or JDK 1.8 depending upon the error you are getting. You can check The Complete Java Masterclass to learn more about class files and how Java works in general.



How to specify Java Version for Maven in Command prompt

The solution was easy in my case but one of my readers reported that he can't change an environment variable in his PC without elevated access or calling to Desktop support, which happens mainly on a big organization like Investment banks.

If you also stuck in a similar situation, don't worry. You can still change the JAVA_HOME environment variable in the local shell you are running the maven command by using the "set" command as shown below:

$ set JAVA_HOME=path-to-jdk-bin-directory


The change will be temporary and only applicable to the shell you are running. It will not affect your machine's JAVA_HOME settings and will go away as soon as you close the shell or open a new shell.

This solution is really nice as you don't need elevated access and can solve the problem immediately. Btw, if you want to learn about Maven itself, I suggest you take a look at the Maven Fundamentals by Bryan Hansen course on Pluralsight, one of the better courses to start with Maven.

How to specify Java Version for Maven in Windows?


Btw, you would need a Pluralsight membership to get access this course, which cost around $29 per month or $299 annually (14% discount).  If you don't have Pluralsight membership, I encourage you to get one because it allows you to access their 5000+ online courses on all latest topics like front-end and back-end development, machine learning etc.

It also include interactive quizzes, exercises, and latest certification material .
It's more like Netflix for Software Developers and Since learning is an important part of our job, Plurlasight membership is a great way to stay ahead of your competition.

They also provide a 10-day free trial without any commitment, which is a great way to not just access this course for free but also to check the quality of courses before joining Pluralsight.



Specific Java version change for Maven

Btw, if you want a more permanent solution without touching the JAVA_HOME environment variable then you can also edit the Maven's start scripts like mvn.bat on Windows and maybe mvn.sh in Linux and specify the JAVA_HOME variable there.

For example, you can change the Maven default version to the specific JDK version by editing mvn.bat file to add the set JAVA_HOME=path-to-jdk-bin-directory line after @REM ==== START VALIDATION ==== in mvn.bat (i.e., %MAVEN_HOME%\bin\mvn.bat) as shown below:

@REM ==== START VALIDATION ====
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181\bin
if not "%JAVA_HOME%" == "" goto OkJHome

This means whenever you run the mvn command from command line window in your Windows machine, it will use JDK 1.8.0_181 to run it's a plugin and build your project.

Here is the screenshot of Maven batch file which tells where exactly you need to put the JAVA_HOME variable:




That's all about how to specify Java version for Maven in Windows. As I have said, Maven doesn't use PATH but uses the JAVA_HOME environment variable. Which means you need to specify the Java version there. If you are running multiple JDK and don't want to change the JAVA_HOME setting or you don't have access to change JAVA_HOME, then just specify JAVA_HOME environment variable in your local shell and run the mvn command.

Similarly,  If you are getting the Unsupported major.minor version 51.0 or Unsupported major.minor version 52.0 error while building your project or any open source project using Maven, please check the JAVA_HOME environment variable in your machine and change it to JDK 1.7 or JDK 1.8 depending upon the error you are getting.

For example, Unsupported major.minor version 51.0 means JAVA_HOME is pointing to JDK 1.6 or lower and Maven using that to run it's compiler plugin to build your project and that needs JDK 7 or higher.  On the other hand Unsupported major.minor version 52.0 means JAVA_HOME is pointing to Java 7 or lower and you need to change it to point to Java 8 or higher to run Maven successfully.


Further Learning
Maven Crash Course
Maven Fundamentals by Bryan Hansen
Java Maven: 102 The Truth About Building Java Programs


Other Maven articles you may like
  • What is the difference between Maven, ANT, and Jenkins? (answer)
  • How to increase the heap size of Maven? (steps)
  • How to fix Maven Eclipse Dependency search not working issue? (solution)
  • How to install Maven in Windows 10? (steps)
  • How to build a Java project using ANT? (article)
  • How to create or modify build.xm in ANT? (tutorial)
  • Top 5 Apache Maven Books for Free (books)
  • 10 Points about Maven Java Developer should know (maven)
  • 10 Maven Plugins Every Java Developers should know (plugins)
  • 6 Free Maven and Jenkins Courses for Java developers (courses)

Thanks for reading this article so far. If you find this article useful please share with your friends and colleagues. If you have any questions or feedback please drop a note.

No comments:

Post a Comment