如何在pom.xml文件中指定Java编译器版本?


252

我在netbeans上编写了一个Maven代码,大约有2000多行。当我在netbeans上编译它时,一切都很好,但是如果我想在命令行上运行它,则会出现以下错误:

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        HashSet<Double> resid_List = new HashSet<Double>(Arrays.asList(resid_val));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        List<Integer> ind_ovlpList = new ArrayList<Integer>(Arrays.asList(ind_ovlp));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
public class ColumnComparator implements Comparator<double[]> {

annotations are not supported in -source 1.3
(use -source 5 or higher to enable annotations)
@Override

我尝试使用Java 1.3.1,编译器错误,但出现了更多错误。我从其他帖子中发现我应该修改pom.xml,但是我不知道如何。这是我的pom.xml

<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.mycompany</groupId>
  <artifactId>mavenmain</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>mavenmain</name>
    <url>http://maven.apache.org</url>

   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

   <dependencies>
     <dependency>
       <groupId>junit</groupId>
        <artifactId>junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
     <dependency>
        <groupId>gov.nist.math</groupId>
        <artifactId>jama</artifactId>
        <version>1.0.2</version>
     </dependency>
   </dependencies>
 </project>

如果您能帮助我,那就太好了。


2
是时候升级Java版本了。
Sotirios Delimanolis

5
Java 5支持泛型。无法使其在该Java版本之前工作。
路易吉·门多萨

为OpenJDK的javac的默认值是1.3,其中用于Oracle JDK是1.5
托尔比约恩Ravn的安徒生

两者都比我成为程序员要早!
CorayThan

Answers:


307
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>(whatever version is current)</version>
        <configuration>
          <!-- or whatever version you use -->
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

请参阅配置页面以获取Maven编译器插件:

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

哦,而且:不要使用Java 1.3.x,当前版本是Java 1.7.x或1.8.x


4
您可能还想对使用Maven Enforcer插件运行Maven的JDK版本进行检查:maven.apache.org/enforcer/maven-enforcer-plugin我发现这非常方便,因为我必须支持不同的项目在不同的JDK版本上。例如,它避免了在Java 7项目上使用Java 8进行编译。
Wim Deblauwe 2014年

2
缺少插件版本。它不会引发错误,但是强烈建议在此处设置版本。当前版本是3.3
Lukas Werner

1
@LukasWerner您当然是正确的。但是如果添加版本,则必须每隔几个月编辑一次问题。做出了让步:-)
肖恩·帕特里克·弗洛伊德

请澄清一下...这个标签<version>(当前版本是什么)</ version>的含义是什么?是1.7吗?
伊利亚2015年

2
@Elijah不,那将是Java语言版本。我说的是插件版本。您可以通过以下链接找到该文件:mvnrepository.com/artifact/org.apache.maven.plugins/…–
肖恩·帕特里克·弗洛伊德

360

maven-compiler-plugin它已经存在于pom.xml的插件层次结构依赖性中。签入有效POM。

简而言之,您可以使用以下属性:

<properties>
   <maven.compiler.source>1.8</maven.compiler.source>
   <maven.compiler.target>1.8</maven.compiler.target>
</properties>

我正在使用Maven 3.2.5


哪种方式是“最佳”?与选择的答案相比,此选项不那么冗长,但似乎有点隐藏。甚至Maven 网站文档也显示了使用该插件的过程。
mkobit

2
@mkobit我想这是个人选择。如果需要配置除编译器和源代码版本以外的其他内容,我希望在“插件”部分中进行配置。
leocborges

1
与“配置其他内容”有关的要点。如果我想使用类似google / error-prone之类的东西,则必须使用plugins部分。
mkobit

5
现在,这是@mkobit提供的Maven文档页面上的第一种方法。更好,而且您不必固定编译器插件的版本。
丹妮拉·皮亚托夫

在IntelliJ中重新创建项目后,这对我有用。我必须通过将项目的pom文件作为一个新项目打开来重新打开IntelliJ中的项目,我假设是重新创建了该项目。
user674669

13

通常,您不希望仅评估source版本(javac -source 1.8例如),而是希望同时评估sourcetarget版本javac -source 1.8 -target 1.8
请注意,从Java 9开始,您有一种方式来传达信息,并且以更健壮的方式实现交叉编译兼容性(javac -release 9)。
包裹着的Mavenjavac命令的提供了多种方式来传达所有这些JVM标准选项。

如何指定JDK版本?

使用maven-compiler-pluginmaven.compiler.source/ maven.compiler.target属性指定sourcetarget等效。

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

根据编译器插件Maven文档,它们是等效的, 因为编译器配置中的<source><target>元素使用属性maven.compiler.source以及maven.compiler.target是否已定义属性。

资源

-sourceJava编译器的参数。
默认值为:1.6
用户属性是:maven.compiler.source

目标

-targetJava编译器的参数。
默认值为:1.6
用户属性是:maven.compiler.target

关于默认值sourcetarget,注意, 因为3.8.0maven的编译器,默认值已经从改变1.51.6

在maven-compiler-plugin 3.6中,您有了一种新的方式来指定Java版本

您可以使用release参数

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>9</release>
    </configuration>
</plugin>

您也可以只声明用户属性maven.compiler.release

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

但是目前,最后一个还不够 maven-compiler-plugin版本您使用默认版本并不依赖最新的版本。

Maven release参数传达release:我们可以从Java 9中传递 的新JVM标准选项

针对特定VM版本针对公共,受支持和记录的API进行编译。

这种方法提供了一种标准方法,可以为sourcetargetbootstrapJVM选项指定相同的版本。
请注意,bootstrap为交叉编译指定一个好习惯,如果您也不进行交叉编译,也不会有任何伤害。

哪种方法是指定JDK版本的最佳方法?

对于Java 8及以下版本:

既不maven.compiler.source/ maven.compiler.target性能使用maven-compiler-plugin是更好。实际上,它没有任何改变,因为最终这两种方式依赖于相同的属性和相同的机制:maven核心编译器插件。

好吧,如果您不需要在编译器插件中指定Java版本以外的其他属性或行为,则使用此方法更为合理,因为这更加简洁:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

从Java 9:

release参数(第三点),如果你想使用相同版本的强烈考虑的方式sourcetarget


10

我在Eclipse Neon Simple Maven Java Project中遇到了相同的问题

但是我在pom.xml文件中添加了以下详细信息

   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

右键单击项目> maven>更新项目(选中强制更新)后

它解决了我在项目上显示错误

希望对您有所帮助

坦斯克


当我尝试为SQL Server的Microsoft JDBC驱动程序构建SqlServerSample应用程序时,这对我有用。
斯凯岛-上尉

0
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <fork>true</fork>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin> 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.