是啥导致 Eclipse 中导入的 Maven 项目默认使用 Java 1.5 而不是 Java 1.6,我如何确保它不使用?

Posted

技术标签:

【中文标题】是啥导致 Eclipse 中导入的 Maven 项目默认使用 Java 1.5 而不是 Java 1.6,我如何确保它不使用?【英文标题】:What causes imported Maven project in Eclipse to use Java 1.5 instead of Java 1.6 by default and how can I ensure it doesn't?是什么导致 Eclipse 中导入的 Maven 项目默认使用 Java 1.5 而不是 Java 1.6,我如何确保它不使用? 【发布时间】:2011-04-02 03:13:37 【问题描述】:

我导入了一个 Maven 项目,它使用了 Java 1.5,尽管我将 1.6 配置为我的 Eclipse 默认 Preferences->Java->Installed JREs

当我将 Maven 项目更改为使用 1.6 JRE 时,它仍然存在项目使用 Java 1.5 时遗留的构建错误(我在前面描述了这些构建错误:I have build errors with m2eclipse but not with maven2 on the command line - is my m2eclipse misconfigured?)

我将删除该项目并重试,但我想确保这次它从一开始就使用 Java 1.6,看看这是否消除了构建问题。

我如何确保项目在导入时使用 Java 1.6?

【问题讨论】:

m2eclipse 会忽略您为 Eclipse 默认配置的内容。默认情况下,它将始终使用 1.5。但是,在您的情况下,该项目使用 maven-compiler-plugin 并将版本明确设置为 1.5。您将需要在 pom 中更改它并更新项目配置以更改版本。但是我已经尝试过了,但它对我不起作用。我很确定这不是问题,尽管其他人在您的其他问题中说了些什么。 不,m2eclipse 不会总是默认为 1.5,它会默认为 maven-compiler-plugin 的设置。 如何更改maven-compiler-plugin的设置? 相关:Warning - Build path specifies execution environment J2SE-1.4 【参考方案1】:

m2eclipse 插件不使用 Eclipse 默认值,m2eclipse 插件从 POM 派生设置。因此,如果您希望将 Maven 项目配置为在 Eclipse 下导入时使用 Java 1.6 设置,请按照我已经建议的方式适当配置 maven-compiler-plugin

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

如果您的项目已经导入,请更新项目配置(右键单击项目然后Maven V更新项目配置)。

【讨论】:

请不要大喊大叫。这太粗鲁了。删除并重新导入项目后它确实有效。但并非如此。 @Raoul 如果您像我写的那样更新项目配置,它无需重新导入项目即可工作。我确实测试了 3 次,它只适用于我的机器。 Pascal 的回答很清楚(我加 1)“更新项目配置”似乎在所有情况下都不起作用,因为我也必须删除项目,我尝试了很多其他的东西(可能是 Eclipse 版本中的错误) 对于较新的 Java 版本,请参阅 this 答案【参考方案2】:

我将它添加到项目描述下方的 pom.xml 中并且它起作用了:

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

【讨论】:

这比公认的答案简单,对我也有好处。 这对我有用,但接受的答案不起作用。 这和配置 maven-compiler-plugin 有什么区别(根据接受的答案)?两种方式都适合我。 如果您使用的是 Java 9,请注意版本编号已更改。所以使用 9 而不是 1.9。 &lt;properties&gt; &lt;maven.compiler.source&gt;9&lt;/maven.compiler.source&gt; &lt;maven.compiler.target&gt;9&lt;/maven.compiler.target&gt; &lt;/properties&gt; 我认为设置一个属性“java.version”并在“maven-compiler-plugin”配置的构建配置中使用它就足够了。显然,“maven.compiler.source”和“maven.compiler.target”属性必须有一些Eclipse Maven插件交互,因为问题刚刚消失。【参考方案3】:

我想在已经提供的答案中添加一些内容。 maven-compiler-plugin 默认情况下将使用 Java 1.5 编译您的项目,这是 m2e 获取其信息的地方。

这就是为什么你必须在你的项目中用 1.5 以外的东西显式声明maven-compiler-plugin。您的有效pom.xml 将隐式使用maven-compiler-plugin pom.xml 中的默认设置。

【讨论】:

对我来说,这更清楚地回答了“为什么我创建一个新的 Maven 项目时它是 1.5?” @LIttleAncientForestKami 用 3.7.0 验证,现在这些值设置为常量 DEFAULT_SOURCEDEFAULT_TARGET,但仍然都设置为 1.5。 现在应该是 1.6 了吧?我想知道,因为它似乎仍然对我使用 1.5。 @Line:不,在已知的 maven-verse 结束之前,它可能是 1.5,因为超级有效的父 pom 不应该改变。 这是讽刺吗? ;) 答案中链接的网站说“另请注意,目前默认源设置为 1.6,默认目标设置为 1.6”..【参考方案4】:
<project>

    <!-- ... -->

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

</project>

【讨论】:

内部 不喜欢这个答案,因为它只是代码,我看不出比接受的代码有优势(可能是因为它没有被描述..)【参考方案5】:

您的 JRE 可能是在运行配置中定义的。按照 Eclipse 中的这些步骤更改构建 JRE。

1) 右键单击​​项目并选择Run As > Run Configurations

2) 从运行配置窗口,在左侧面板中选择您的项目构建配置。在右侧,您将看到各种选项卡:Main、JRE、Refresh、Source...

3) 点击 JRE 选项卡,您应该会看到类似这样的内容

4) 默认情况下,将使用 Work Default JRE(您在 Preferences->Java->Installed JREs 下选择的默认 JRE)。如果您想使用另一个已安装的 JRE,请勾选 Alternate JRE 复选框并从下拉列表中选择您喜欢的 JRE。

【讨论】:

感谢您的回答,我的运行配置使用工作区默认运行,所以这真的很有帮助! 这有帮助,不敢相信我们忽略了这一点!【参考方案6】:

这里是java 1.5的根本原因:

另外请注意,目前默认源设置为 1.5,默认目标设置为 1.5,与运行 Maven 的 JDK 无关。如果要更改这些默认值,则应设置源和目标。

参考:Apache Mavem Compiler Plugin

以下是详细信息:

纯 pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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.pluralsight</groupId>
    <artifactId>spring_sample</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

以下插件取自扩展的 POM 版本(Effective POM),

这可以通过命令行C:\mvn help:effective-pom这个命令得到,我只是放了一个小sn-p而不是整个pom。

    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
      <execution>
        <id>default-compile</id>
        <phase>compile</phase>
        <goals>
          <goal>compile</goal>
        </goals>
      </execution>
      <execution>
        <id>default-testCompile</id>
        <phase>test-compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

即使在这里你也看不到java版本定义在哪里,让我们挖掘更多......

下载插件,Apache Maven Compiler Plugin » 3.1 作为它在 jar 中的可用,并在任何文件压缩工具中打开它,如 7-zip

遍历罐子找出来

插件.xml

文件夹内的文件

maven-compiler-plugin-3.1.jar\META-INF\maven\

现在您将在文件中看到以下部分,

      <configuration>
    <basedir implementation="java.io.File" default-value="$basedir"/>
    <buildDirectory implementation="java.io.File" default-value="$project.build.directory"/>
    <classpathElements implementation="java.util.List" default-value="$project.testClasspathElements"/>
    <compileSourceRoots implementation="java.util.List" default-value="$project.testCompileSourceRoots"/>
    <compilerId implementation="java.lang.String" default-value="javac">$maven.compiler.compilerId</compilerId>
    <compilerReuseStrategy implementation="java.lang.String" default-value="$reuseCreated">$maven.compiler.compilerReuseStrategy</compilerReuseStrategy>
    <compilerVersion implementation="java.lang.String">$maven.compiler.compilerVersion</compilerVersion>
    <debug implementation="boolean" default-value="true">$maven.compiler.debug</debug>
    <debuglevel implementation="java.lang.String">$maven.compiler.debuglevel</debuglevel>
    <encoding implementation="java.lang.String" default-value="$project.build.sourceEncoding">$encoding</encoding>
    <executable implementation="java.lang.String">$maven.compiler.executable</executable>
    <failOnError implementation="boolean" default-value="true">$maven.compiler.failOnError</failOnError>
    <forceJavacCompilerUse implementation="boolean" default-value="false">$maven.compiler.forceJavacCompilerUse</forceJavacCompilerUse>
    <fork implementation="boolean" default-value="false">$maven.compiler.fork</fork>
    <generatedTestSourcesDirectory implementation="java.io.File" default-value="$project.build.directory/generated-test-sources/test-annotations"/>
    <maxmem implementation="java.lang.String">$maven.compiler.maxmem</maxmem>
    <meminitial implementation="java.lang.String">$maven.compiler.meminitial</meminitial>
    <mojoExecution implementation="org.apache.maven.plugin.MojoExecution">$mojoExecution</mojoExecution>
    <optimize implementation="boolean" default-value="false">$maven.compiler.optimize</optimize>
    <outputDirectory implementation="java.io.File" default-value="$project.build.testOutputDirectory"/>
    <showDeprecation implementation="boolean" default-value="false">$maven.compiler.showDeprecation</showDeprecation>
    <showWarnings implementation="boolean" default-value="false">$maven.compiler.showWarnings</showWarnings>
    <skip implementation="boolean">$maven.test.skip</skip>
    <skipMultiThreadWarning implementation="boolean" default-value="false">$maven.compiler.skipMultiThreadWarning</skipMultiThreadWarning>
    <source implementation="java.lang.String" default-value="1.5">$maven.compiler.source</source>
    <staleMillis implementation="int" default-value="0">$lastModGranularityMs</staleMillis>
    <target implementation="java.lang.String" default-value="1.5">$maven.compiler.target</target>
    <testSource implementation="java.lang.String">$maven.compiler.testSource</testSource>
    <testTarget implementation="java.lang.String">$maven.compiler.testTarget</testTarget>
    <useIncrementalCompilation implementation="boolean" default-value="true">$maven.compiler.useIncrementalCompilation</useIncrementalCompilation>
    <verbose implementation="boolean" default-value="false">$maven.compiler.verbose</verbose>
    <mavenSession implementation="org.apache.maven.execution.MavenSession" default-value="$session"/>
    <session implementation="org.apache.maven.execution.MavenSession" default-value="$session"/>
  </configuration>

查看上面的代码,找出以下2行

    <source implementation="java.lang.String" default-value="1.5">$maven.compiler.source</source>
    <target implementation="java.lang.String" default-value="1.5">$maven.compiler.target</target>

祝你好运。

【讨论】:

是的。这与 Eclipse 无关。例如,如果使用 quickstart 工件创建 Maven 项目,您会在 IntelliJ IDEA 中遇到相同的问题。 您好,感谢您发布问题的根本原因:)非常感谢!【参考方案7】:

Springboot中最简单的解决方案

如果你用Springboot我给你最简单的:

<properties>
  <java.version>1.8</java.version>
</properties>

然后,右键单击您的 Eclipse 项目:Maven > 更新项目 > 从 pom.xml 更新项目配置

应该可以。

【讨论】:

【参考方案8】:

如果您使用 TychoMaven 构建捆绑包,还有一个可能的原因是清单文件 (@987654322) 中有错误的执行环境 (Bundle-RequiredExecutionEnvironment) @) 定义。例如:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Engine Plug-in
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 4.6.5.qualifier
Bundle-Activator: com.foo.bar.Activator
Bundle-Vendor: Foobar Technologies Ltd.
Require-Bundle: org.eclipse.core.runtime,
 org.jdom;bundle-version="1.0.0",
 org.apache.commons.codec;bundle-version="1.3.0",
 bcprov-ext;bundle-version="1.47.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.5
Export-Package: ...
...
Import-Package: ...
...

就我而言,其他一切都很好。编译器插件(以及普通的 maven 和 tycho)设置正确,由于清单,m2 仍然生成旧的合规级别。我想我分享一下经验。

【讨论】:

就是这样!非常感谢!此外,使用 maven 构建并使用 DEBUG 日志级别时,您可能会看到错误的执行环境设置以及该设置的来源:“[DEBUG] Using execution environment 'JavaSE-1.8' configured in Bundle-RequiredExecutionEnvironment”【参考方案9】:

项目特定设置

另一个可能出错的地方是项目特定的设置,在 Eclipse 中。

    项目属性:单击您的项目和以下选项之一:

    Alt + Enter 菜单 > 项目 > 属性 右键单击您的项目 > 项目属性(菜单中的最后一项)

    点击“Java 编译器”

    取消选中“启用项目特定设置”(或手动更改它们)。

由于客户要求,我们启用了它们以将我们的项目保留在 1.6 中。当需要升级到 1.7 时,我们遇到了困难,因为我们需要到处更改 java 版本:

项目 POM Eclipse 工作区默认 项目特定设置 执行虚拟机(1.6 用于一切)

【讨论】:

【参考方案10】:

如果有人想知道为什么 Eclipse 仍将 J2SE-1.5 库放在 Maven 项目的 Java 构建路径上,即使 maven.compiler.release 属性指定了 Java 版本 >= 9(截至 2020 年 10 月,即 Eclipse 2020-09 版,包括 Maven 3.6.3 版):Maven 默认使用 3.1 版的 Maven 编译器插件,而 release property 仅在 3.6 版中引入。

因此,在使用 release 属性时,不要忘记在 pom.xml 中包含当前版本的 Maven 编译器插件:

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

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
        </plugin>
    </plugins>
</build>

或者,或者不那么突出,直接在插件配置中指定 Java 版本:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <release>15</release>
            </configuration>
        </plugin>
    </plugins>
</build>

这会收到Line's 对已接受答案的评论,如果我早点看到它,本可以为我节省一个小时的搜索时间。

【讨论】:

【参考方案11】:

我发现我的问题是有人提交了将 Java1.5 引用为默认 JRE 的文件 .project 和 .classpath。

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
    <attributes>
        <attribute name="owner.project.facets" value="java"/>
    </attributes>
</classpathentry>

通过关闭项目,删除文件,然后作为 Maven 项目重新导入,我能够正确地将项目设置为使用工作区 JRE 或相关 jdk,而不会恢复到 1.5 。因此,请避免将 .project 和 .classpath 文件签入您的 SVN

希望这对其他人有所帮助。

【讨论】:

【参考方案12】:

如果您想确保 Eclipse 中新创建的项目或导入的项目使用 Java 1.5 以外的其他默认 java 版本,您可以更改 maven-compiler-plugin 中的配置。

转到文件夹 .m2/repository/org/apache/maven/plugins/maven-compiler-plugin/3.1 使用 zip 程序打开 maven-compiler-plugin-3.1.jar。 进入 META-INF/maven 并打开 plugin.xml

在以下几行中:$maven.compiler.source$maven.compiler.target

将默认值更改为 1.6 或 1.8 或任何您喜欢的值。

保存文件并确保将其写回 zip 文件。

从现在开始,所有新的 Maven 项目都使用您指定的 java 版本。

信息来自以下博文:https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/

【讨论】:

【参考方案13】:

要更改 JDK 的版本,您可以:

1- 项目 > 属性 2- 转到 Java 构建路径 3- 在库中,选择 JRE System ... 并单击编辑 4- 选择合适的版本并验证

【讨论】:

以上是关于是啥导致 Eclipse 中导入的 Maven 项目默认使用 Java 1.5 而不是 Java 1.6,我如何确保它不使用?的主要内容,如果未能解决你的问题,请参考以下文章

我可以选择我在 Maven 依赖项中使用的唯一包来在 Eclipse 中导出可运行的 jar 吗?

androidstudio中导入的jar包没有主清单属性怎么办

androidstudio中导入的jar包没有主清单属性怎么办

eclipse中导入的项目出错,项目上有一个大大的x,怎麽办,求大神指点。。

如何在intellij IDEA中导入ECLIPSE的android项目

在Eclipse中导入SVN库里的Maven项目