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引數。