Ant中设置特定的JDK版本

今天在Jenkins上创建一个Ant编译项目的时候报错"java.lang.UnsupportedClassVersionError:com/sun/tools/javac/Main : Unsupported major.minor version 52.0",很明显是JDK版本不一致所导致的。服务上用的是JDK8,原来在MyEclipse中编译项目的时候指定的是JDK1.6版本,现在环境发生变化,问题就出现了

原因分析

  我们知道Java是支持向后编译的,也就是说,在低版本(如JDK6)上编译的class文件或者jar文件可以在高版本上(如JDK8)上编译通过,但这并不意味着在JDK7上编译的class文件就可以在JDK5上顺利通过编译。为什么?因为高版本通常有很多低版本不支持的新特性。想想看,你能够在JDK5上编译含有lambda表达式或者Stream API的代码吗?当然不行。即便你没有使用那些低版本不支持的新特性,每个class文件都有一个major或者minor版本号,这是存在于Java编译器中的,并且和JDK的版本号是对应的,下面我们列出对应JRE的major版本号:

Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

如何在Ant编译的时候指定JDK的版本呢?需要在build.xml文件中添加对应的配置,javac编译的时候指定版本。

原来配置:

……
<target name="3.COMPILE" depends="2.RESOURCE">
	<echo message="编译开始..." />
	<javac  srcdir="${dist.src}" destdir="${dist.classes}" encoding="utf-8" includeantruntime="on" listfiles="false">
	    <classpath>
		    <fileset dir="${webapp}/WEB-INF/lib">
			    <include name="**/*.jar" />
		    </fileset>
	    </classpath>
	</javac>
	<echo message="编译完成。如有警告提示可忽略。" />
</target>
……

增加target="1.6" source="1.6"版本配置,如下:

……
<target name="3.COMPILE" depends="2.RESOURCE">
	<echo message="编译开始..." />
	<javac target="1.6" source="1.6" srcdir="${dist.src}" destdir="${dist.classes}" encoding="utf-8" includeantruntime="on" listfiles="false">
	    <classpath>
		    <fileset dir="${webapp}/WEB-INF/lib">
			    <include name="**/*.jar" />
		    </fileset>
	    </classpath>
	</javac>
	<echo message="编译完成。如有警告提示可忽略。" />
</target>
……

修改之后,清空整个工程,然后重新编译,就可以了。


注:
1.其实真正起作用的是target参数,如果只设置target参数,在编译时会有如下警告:
[javac]           WARNING
[javac]
[javac] The -source switch defaults to 1.8 in JDK 1.8.
[javac] If you specify -target 1.6 you now must also specify -source 1.6.
[javac] Ant will implicitly add -source 1.6 for you.  Please change your build file.
所以建议同时添加source参数。
 

猜你喜欢

转载自blog.csdn.net/chenxing109/article/details/84833044