使用 Maven 设置 Java 编译器的 -source 和 -target - 不起作用

2022-09-02 09:30:27

我已经设置了我的pom文件,要求Maven使用和config参数编译我的源代码,使其与1.5版本兼容。这是我的绒球:sourcetarget

<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 起推出。但是,用工作编译我的代码,虽然我本来以为它会失败,因为我已经将Maven设置为将我的代码编译为Java 1.5,并在Java 1.6中引入。任何人都可以建议我可能做错了什么吗?在编译时强制 Maven 使用特定 Java 版本的正确方法是什么?mvn compileString#isEmpty

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

谢谢。


答案 1

编译器插件页面底部的注释中:

仅设置目标选项并不能保证代码实际运行在具有指定版本的 JRE 上。陷阱是意外使用仅在以后的 JRE 中存在的 API,这会使代码在运行时失败并出现链接错误。若要避免此问题,可以将编译器的引导类路径配置为与目标 JRE 匹配,或者使用 Animal Sniffer Maven 插件来验证代码是否未使用意外的 API

这意味着,尽管您正在生成 1.5 级字节码,但您仍然可以(无意中)调用 1.6 API 方法。要标记这些无效的 API 调用,请使用它们提到的插件。


答案 2

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


推荐