阻止IntelliJ IDEA在每次重新加载pom时切换Java语言级别(或更改默认项目语言级别)。

188
使用IntelliJ 12,我有一个Java项目,使用pom.xml的maven。我的项目正在使用Java8,但在导入项目时,默认项目语言级别似乎已设置为6。
我可以将语言级别更改为8.0(F4->模块->语言级别),但每次编辑pom.xml时,项目级别都会切换回“使用项目语言级别”,我不得不一遍又一遍地编辑这些设置。
有什么需要添加到pom.xml中来将默认语言级别设置为8.0吗?

2
你的pom文件在编译器插件配置中是否指定了源代码和目标代码的级别? - Mark Rotteveel
是的,源代码和目标代码都设置为1.8版本。然而,在项目导入过程中没有指定。 - Quentin
@Quentin 在这种情况下,最简单的方法可能是在新位置重新克隆项目,然后让IntelliJ重新导入。 - Thorbjørn Ravn Andersen
12个回答

217

根据Mark的评论,这是如何做到的:

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

12
这个插件已经存在于POM中,并且设置目标为1.8,但是它并没有产生任何效果 :( - Quentin
2
你是否启用了maven pom的自动导入?你是否检查了父(和祖父)pom文件,是否存在任何可能会产生冲突的1.6设置? - vikingsteve
1
实际上,父项目是使用spring-boot-starter-parent-1.1.9.RELEASE.pom.xml定义的,在pluginManagement中,maven-compiler-plugin被设置为1.6...我尝试过覆盖这些设置,但没有成功。看起来spring boot 1.2.RC不再包含maven-compiler-plugin,我会尝试一下。-自动导入已启用。 - Quentin
太好了,这可能就是原因。如果您指定相同版本的Maven编译器插件,可能可以覆盖源/目标设置。也许在您的项目根pom.xml中尝试一下。 - vikingsteve
3
在我的情况下,这种方法没有起作用。我不得不删除这个答案中提到的设置,并添加以下内容: <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> - genonymous
显示剩余4条评论

126

vikingsteve的答案的简短版本如下:

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

7
少了一个烦恼! - Artur Cichosz
4
这不仅是一个简短的版本,而且在我的情况下是必要的。vikingsteve的答案对我没有用,所以我删除了那个设置并使用了这个。 - genonymous

30

我正在将一个项目从JDK 8升级到JDK 10+。我已经正确地指定了编译器属性,如下所示:

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

然而,Idea项目会将语言级别重置为8。
最终我发现Idea的Maven导入过程使用JDK 8来导入项目,这限制了语言级别<=8。
要修复此问题,我更新了“设置- >构建、执行、部署- >构建工具- >Maven- >导入”下的“导入器JDK”属性,以使用JDK 11。

enter image description here


4
问题已解决。看起来IntelliJ在后续版本中更新了其内部JRE(大约在2019.2左右)。很难追踪到这一点... - Hasan Aslam
3
谢谢!我尝试了所有其他建议,但没有成功。这是缺失的部分,我自己找不到。 - LittletonDoug

24

我认为这与Maven编译器插件和IntelliJ idea之间的概念冲突有关。显然,较新版本的编译器插件具有默认级别1.5(参见http://maven.apache.org/plugins/maven-compiler-plugin/)。因此,如果在项目中使用编译器插件,并且未在pom.xml中明确设置编译器级别,则每当重新处理POM时,级别将恢复为默认值。

因此存在一个被Intellij IDEA忽略的概念上的冲突。该IDE仍然允许设置项目和模块设置,但不提供警告或反馈,指出此设置由pom.xml控制。解决方案要么是明确允许覆盖POM编译器插件设置(也许不明智,因为那么您在命令行上使用maven时会发生什么),要么在POM生效时停用IDE中的控件。

目前的解决方案是在pom中设置所需的编译器级别,然后重新导入,而不是尝试在模块设置中进行设置。


2
同意。在IDEA中设置的缺乏反馈,只会被忽略并从POM重新导入,这一点非常令人困惑,特别是在使用父POM时。 - Gillfish

9

有两种方法可以做到这一点,将其中之一添加到您的pom.xml文件中:

第一种方法- 添加属性

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

第二步 - 添加插件

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

如果有帮助,请告诉我。


我已经尝试过这两种方法,但每次在IntelliJ中运行mvn compile时,编译器仍然被重置为1.5。但是,在IntelliJ之外的命令行中运行时,它可以正常工作。 - user26270
1
在IntelliJ中,修改后记得重新导入Maven设置。这个解决方案对我很有效。 - Pierluigi Vernetto

5

在我的情况下,这些解决方案都没有帮助。我不需要在pom.xml中指定任何Java版本。

我需要打开<project-name>.iml文件并在其中更改JDK版本。

<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
    <!-- ...                                                   ^ -->
    <!-- ...                                                   | -->

更新:

<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
    <!-- ...                                                   ^ -->
    <!-- ...                                                   | -->

这根本没有任何意义。我从未为Java 1.5指定JDK版本。

这本身就解决了在IntelliJ 2019.3中的问题,而不需要我在我的pom文件或其他任何地方进行任何更改。同样,我也从未在任何地方指定JDK 1.5。 - Michael Christoff
<... LANGUAGE_LEVEL="JDK_11"> - Daniel De León

3
对我有用的解决方法是一系列更新:
  • 在项目结构 > 模块:将语言级别 Java 版本更改为 8
  • 在项目结构 > 项目:Java 版本应该是 1.8
  • 在 pom 文件中,执行与上述响应中指定的相同更改
  • 在设置 > Java 编译器 > 将字节码版本更改为 8
  • 在设置 > maven > 导入 > 导入程序的 JDK 应该是 1.8

谢谢!在“项目结构”>“项目设置”中更改项目SDK和模块SDK对我很有帮助。 - Babad00k

1
由于使用Dropwizard构建微服务,我在这个问题上遇到了很多困难。最终我发现我的构建属性存放在错误的pom文件中(即主服务的pom.xml文件)。
因此,尽管其他包更像是库,我仍然无法使用Java 8语法。
当我将构建插件重构到“全局”的.pom.xml文件中时,所有子容器都能够使用新的语法。
可能会帮助一些遇到多容器项目问题的人。

1
感谢,它可以工作。
注意不要犯我犯的同样错误。
如果您有配置文件,请在正确的配置文件中添加插件。
<profiles>
    <profile>
        <id>foo</id>
        <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        </build>
    </profile>
    <profile>
        <id>bar</id>
        .......
    </profile>
<profiles>

0

问题:期望的Java版本为11,但卡在版本8

  • 我尝试了几乎所有的答案,但仍然被language_level 8困住了,在我的项目或Intellij IDE中找不到任何与Java版本8相关的痕迹。

  • 然后我探索了父级的pom.xml,但没有成功,但在祖父级别pom.xml中,我发现发布版本是8。

解决方案:在属性中添加以下3行使得差异。

<properties>
  <maven.compiler.source>11</maven.compiler.source>
  <maven.compiler.target>11</maven.compiler.target>
  <maven.compiler.release>11</maven.compiler.release>
</properties>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接