是什么导致默认情况下导入的Eclipse中的Maven项目使用Java 1.5而不是Java 1.6,并且如何确保不使用Java 1.5?


209

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

当我将Maven项目更改为使用1.6 JRE时,它仍然存在项目使用Java 1.5时遗留下来的构建错误(我在以下内容中描述了这些构建错误:我在命令行中使用m2eclipse而不是maven2进行了构建错误-我的m2eclipse配置错误吗?

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

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


4
m2eclipse会忽略您为Eclipse默认配置的内容。默认情况下,它将始终使用1.5。但是,在您的情况下,项目使用maven-compiler-plugin并将版本明确设置为1.5。您将需要在pom中进行更改,并更新项目配置以更改版本。但是,我已经尝试过了,但对我没有用。我很确定这不是问题,尽管其他人在您的其他问题中说了什么。
拉乌尔·杜克

1
不,m2eclipse并非总是默认为1.5,而是默认为maven-compiler-plugin的设置。
Pascal Thivent 2010年

1
您如何更改Maven-compiler-plugin的设置?
Lokathor

Answers:


248

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 Update Project Configuration)。


1
请不要喊。没礼貌 在删除并重新导入项目后,它确实起作用了。但并非如此。
拉乌尔·杜克

6
@Raoul如果您按照我的描述更新项目配置,则无需重新导入项目即可工作。我确实对此进行了3次测试,但它只能在我的机器上运行。
Pascal Thivent

正如Pascal的回答很清楚(我加上1表示),“更新项目配置”似乎在所有情况下都不起作用,因为我也必须删除该项目,并且我尝试了很多其他事情(也许是一个错误)在eclipse版本中)
rogermushroom 2011年

较新的Java版本,请参阅这个答案
线

33

我将其添加到项目描述下方的pom.xml中,并且可以正常工作:

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

1
这比接受的答案简单,对我也有好处。

1
这对我有用,但是可接受的答案不起作用。
桑杰·辛格

1
这和配置maven-compiler-plugin(根据公认的答案)有什么区别?两种方式都对我有用。
Aamir Rizwan '18

如果使用的是Java 9,请注意版本号已更改。因此,请使用9而不是1.9。 <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
chux

我认为设置属性“ java.version”并在“ maven-compiler-plugin”配置的构建配置中使用它就足够了。显然,“ maven.compiler.source”和“ maven.compiler.target”属性必须与Eclipse Maven插件交互,因为问题刚刚消失。
JasonTolotta

29

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

这就是为什么您必须在项目中显式声明maven-compiler-plugin而不是1.5的原因。您的效果器pom.xml将隐式使用maven-compiler-plugin中 的默认设置pom.xml


6
对我来说,这更清楚地回答“为什么当我创建一个新的Maven项目时为什么是1.5?”
Don Cheadle

1
@LIttleAncientForestKami已通过3.7.0验证,目前,这些值已设置为常量DEFAULT_SOURCEDEFAULT_TARGET,但仍都设置为1.5。
亚当·伯利

现在应该是1.6,对吧?我不知道因为它似乎仍然对我使用1.5。
在线

@Line:不,在已知的maven-verse结束之前,它可能为1.5,因为超级有效的父pom永远都不会改变。
尼古拉斯

这具有讽刺意味吗?;)这是在回答链接该网站说,“还要注意的是,目前默认源设置为1.6,默认目标设定为1.6” ..

27
<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>

8
内部<build> </ build>
Phillip Kamikaze 2015年

不喜欢这个答案,因为它是唯一的代码,我没有看到过一个公认的优势,(也许是因为它没有描述。)
在线

8

这是Java 1.5的根本原因:

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

参考:Apache Mavem编译器插件

以下是详细信息:

纯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版本(有效POM),

这可以从命令行中通过该命令获得,C:\mvn help:effective-pom我只是在这里放了一个小片段,而不是整个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)中打开

遍历罐子并查找

plugin.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>

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

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

祝好运。


1
是。这与Eclipse无关。例如,如果使用quickstart工件创建Maven项目,则在IntelliJ IDEA中会遇到相同的问题。
Jan Hettich

嗨,感谢您发布问题的根本原因:)非常感谢!
IanGabes

6

您的JRE可能是在运行配置中定义的。在Eclipse中遵循以下步骤来更改构建JRE。

1)右键单击项目,然后选择运行方式 >运行配置

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

3)单击JRE选项卡,您应该会看到类似以下的内容

在此处输入图片说明

4)默认情况下,将使用“工作默认JRE”(您在Preferences-> Java-> Installed JREs下选择为默认的JRE)。如果要使用另一个已安装的JRE,请选中“ 备用JRE”复选框,然后从下拉列表中选择首选的JRE。


感谢您提供此答案,我的运行配置正在使用工作区默认值运行,因此这确实有所帮助!
DamirCiganović-Janković2015年

这有帮助,不敢相信我们忽略了这一点!
Phil oO 2016年

3

Springboot中最简单的解决方案

如果您使用Springboot,我会给您最简单的方法:

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

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

那应该做。


2

项目特定设置

在Eclipse中,项目特定的设置可能会出错。

  1. 项目属性:单击您的项目,然后单击以下选项之一:

    • Alt + Enter
    • 菜单>项目>属性
    • 右键单击您的项目>项目属性(菜单中的最后一项)
  2. 点击“ Java编译器”

  3. 取消选中“启用项目特定设置”(或手动更改所有设置)。

由于客户的要求,我们使他们能够将我们的项目保持在1.6。当需要升级到1.7时,我们遇到了困难,因为我们需要到处更改Java版本:

  • 项目POM
  • Eclipse工作区默认
  • 项目特定设置
  • 执行虚拟机(1.6用于所有操作)

1

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

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仍然生成了旧的合规性级别。我以为我分享经验。


1

我发现我的问题是有人提交了将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

希望这对其他人有帮助。


0

如果要确保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
  • 在以下各行中:
    <源实现=“ java.lang.String”默认值=“ 1.5”> $ {maven.compiler.source} </ source>
    <目标实现=“ java.lang.String”默认值=“ 1.5”> $ {maven.compiler.target} </ target>

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

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

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

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


0

要更改JDK的版本,您可以执行以下操作:

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

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.