哪个编译器版本maven在这里使用?

时间:2016-05-02 17:02:04

标签: java maven compilation

我使用下面的maven编译器插件来编译我的java代码:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <inherited>true</inherited>
    <version>2.5.1</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
    </configuration>
</plugin>

我的java_home指向Java 7。

我的第一个问题,我的课程是用java 6还是java 7编译的?

如果使用java 6(因为<source>1.6</source>),maven将如何知道 路径java 1.6作为java home指向1.7?

如果我需要使用java 1.8编译源代码,是否需要将source和target设置为1.8?

但是,maven会怎么知道jdk 1.8正在路径中?

我是否需要将java_home更改为指向java 8?

2 个答案:

答案 0 :(得分:5)

简答:

  1. 由于JAVA_HOME指向Java 1.7,因此将使用Java 1.7中的javac程序(编译器)。但是,由于sourcetarget都是1.6,因此命令mvn compile将生成可在 JRE 1.6 上运行的类。如果您使用javap实用程序看到与生成的类文件关联的主要版本号和次要版本号,这将是显而易见的。对于Java 1.8,这些值为52 and 0,对于Java 1.7,它们为51 and 0,对于Java 1.6,它们为50 and 0。您可能想知道为什么您希望Java 1.7编译器生成target = 1.6的类。原因是基于您要运行类的运行时(JRE)。如果您的编译器和运行时总是同意该版本,您可能不会使用这些,但这些升级需要在大型团队中进行协调,同时,您应该始终尽量保持最新状态。该软件的版本(一个主要原因:您想要修复错误)。要记住的另一件事是source release 1.n requires target release 1.n

  2. 是的,将这些值<source><target>更改为1.8(这可能是一条捷径,但让我们稍后再这样做;)) 。确保JAVA_HOME(和PATH)指向JDK 1.8,因为maven-compiler-plugin最终委托PATH中的javac程序,其-source-target参数来自插件的<configuration>。查看mvn -X compile的输出,您将得到类似的内容:

  3. [DEBUG]   (f) source = 1.8 
    [DEBUG]   (f) staleMillis = 0 
    [DEBUG]   (f) target = 1.8 
    [DEBUG]   (f) useIncrementalCompilation = true 
    [DEBUG]   (f) verbose = false 
    [DEBUG] -- end configuration -- 
    [DEBUG] Using compiler 'javac'.
    

    请注意来自Maven docs的以下警告:

      

    仅设置target选项并不能保证您的代码实际上在具有指定版本的JRE上运行。缺陷是无意中使用的API,这些API仅存在于以后的JRE中,这会使您的代码在运行时因链接错误而失败。要避免此问题,您可以配置编译器的引导类路径以匹配目标JRE,或使用Animal Sniffer Maven Plugin验证您的代码不使用非预期的API。

答案 1 :(得分:-1)

Maven使用在JAVA_HOME中设置的JDK。您可以在mvn.bat中设置以查找特定的JDK位置。