2011-02-25 85 views
19

我已经设置了我的pom文件,要求Maven使用sourcetarget config params编译我的源代码,使其版本1.5兼容。这里是我的POM:使用Maven设置Java编译器的-source和-target不起作用

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com</groupId> 
    <artifactId>user</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>test</name> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.5</source> 
      <target>1.5</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

而且我有一个简单的主类是这样的:

package com.user; 
public class Test 
{ 
    public static void main(String[] argv) 
    { 
     System.out.println("".isEmpty()); 
    } 
} 

String#isEmpty()自从Java 1.6中引入的。然而,编译我的代码mvn compile的作品,虽然我会预料它会失败,因为我已经设置Maven编译我的代码到Java 1.5和String#isEmpty是在Java 1.6中引入的。任何人都可以请建议我可能做错了什么?编译时强制Maven使用特定Java版本的正确方法是什么?

有关信息,我正在使用Apache Maven 2.2.1和javac 1.6.0_19。

谢谢。

回答

28

从在compiler-plugin page底部注:

仅仅设置目标选项并不能保证你的代码在一个JRE实际运行与指定版本。陷阱是意外使用仅存在于后续JRE中的API,这会使您的代码在运行时出现链接错误而失败。为了避免这个问题,您可以配置编译器的引导类路径以匹配目标JRE或使用动物嗅探Maven插件来验证您的代码不使用API​​的意外

这意味着,虽然你产生1.5级别的字节码,您仍可以(无意)调用1.6 API方法。要标记这些无效的API调用,请使用他们提到的插件。

+1

这是一个很好的解决方案,但不幸的是它不处理其他一些API不兼容性,如部分接口实现。如果你没有实现Iterator的remove()方法,它将在java 8下编译,因为接口中有'default'关键字,但是不会在java 7下编译。而且这个嗅探器插件不会被捕获,因为这不仅仅是一个方法呼叫。 – Innokenty 2015-06-26 16:16:55

+0

以下是关于如何使用Animal Sniffer的官方指南,以及为什么:https://maven.apache.org/guides/mini/guide-building-jdk14-on-jdk15.html – Innokenty 2015-06-26 16:22:01

8

如果您希望它找不到String.isEmpty(),则需要使用较低版本的Java进行编译。源级别控制您可以使用和不能使用的语言级别功能,例如需要编译源级别为1.6的界面上的@Override。目标级别控制编译产生的字节码的兼容性。与可用的API没有任何关系...这些都基于您在构建时使用的类路径,在您的情况下包括Java 1.6。

+0

另外,请确保您的CLASSPATH和JAVA_HOME变量指向正确的JDK版本。 (我在这个问题上挂了,当我需要编译为5时,我的JAVA_HOME指向了Java 6) – hotshot309 2012-03-21 15:27:22