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


145

使用IntelliJ 12,我有一个Java项目,并且将maven与pom.xml一起使用。我的项目使用的是Java8,但似乎在导入项目时默认项目语言级别已设置为6。

我可以将语言级别更改为8.0(F4->模块->语言级别),但是每次我编辑pom.xml时,项目级别都会切换回“使用项目语言级别”,并且我必须再次编辑此设置,然后再次。

我需要添加一些东西到pom.xml来将默认语言级别设置为8.0吗?


2
您的pom是否在编译器插件配置中指定了源级别和目标级别?
Mark Rotteveel 2014年

是的,来源和目标设置为1.8。然而,它并没有在项目导入期间指定
昆汀

@Quentin在这种情况下,将项目重新克隆到新位置并让IntelliJ重新导入可能是最容易的。
托尔比约恩Ravn的安德森

Answers:


174

根据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>

10
该插件存在于pom,wuth 1.8目标中,但它没有任何改变:(
Quentin

2
您是否已启用Maven Pom的自动导入功能?您是否检查了父母(和祖父母)的poms,那里是否有任何1.6设置可能会冲突?
vikingsteve 2014年

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,我来试试看。-启用自动导入。
昆汀2014年

太好了,这可能就是原因。如果您指定相同版本的Maven编译器插件,则可能会覆盖源/目标设置。也许在您的项目根pom.xml中尝试一下。
vikingsteve 2014年

2
就我而言,这行不通。我必须删除此答案中提到的设置,而是添加以下内容:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
gen18

99

vikingsteve的答案的简短版本是:

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

6
少一烦恼!
Artur Cichosz

4
在我看来,这不仅仅是一个简短的版本,而是一个必需的版本。维京史帝夫的答案对我不起作用。因此,我删除了该设置并使用了该设置。
异名

23

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

因此,存在一个概念冲突,Intellij IDEA将忽略该冲突。IDE仍然允许人们设置项目和模块设置,但是不提供警告或反馈,表明该设置由pom.xml控制。解决方案要么是显式地允许覆盖POM编译器插件设置(可能不明智,因为在命令行上使用maven时会发生这种情况),或者是当POM的此设置生效时在IDE中停用控件。

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


1
同意 缺乏反馈意见,即IDEA中的设置将被忽略并从POM重新导入,这非常令人困惑,尤其是在使用父POM时。
Gillfish

9

我正在将项目从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 for importer”属性,以使用JDK 11。

在此处输入图片说明


解决了我的问题。似乎IntelliJ在以后的版本中(大约在2019.2左右)更新了其内部JRE。很难追踪...
Hasan Aslam

8

有两种方法,将其中一种添加到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编译时,编译器仍会重置为1.5。但是,当从IntelliJ外部的命令行运行时,它可以正常工作。
user26270 '18

1
在IntelliJ中,请记住在修改后重新导入Maven设置。该解决方案为我工作。
Pierluigi Vernetto

4

在我看来,所有解决方案均无济于事。我不需要在中指定任何Java版本pom.xml

我需要打开<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 DeLeón

1

由于使用Dropwizard构建微服务,我在这个问题上苦苦挣扎。最终,我发现我的构建属性位于错误的pom文件(主要服务的pom.xml)中。

因此,即使其他软件包更像是library,我也无法使用Java 8语法。

当我将构建插件重构为“ global” .pom.xml文件时,所有子容器都能够使用新语法。

可以帮助多容器项目遇到问题的人


0

对我而言,将POM(插件和属性)更新为所需的Java编译器版本(在我的情况下为1_7)的解决方案有效。但是,由于每个项目的.iml文件都是使用原始pom(如上面的某人所述,默认编译器版本为1_5)生成的,因此JDK版本为1_5,因此它仍将覆盖pom版本。

我手动删除了.idea文件夹,并将模块从更新的pom重新导入到IntelliJ中。从更新的POM重新导入模块时,我可以看到iml文件具有更新的JDK版本(在我的情况下为1_7)。


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.