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

我导入了一个Maven项目,它使用了Java 1.5,即使我已经configuration了1.6默认的Preferences->Java->Installed JREs

当我将Maven项目改为使用1.6 JRE时,仍然存在项目使用Java 1.5时遗留的构build错误(我在前面描述了这些构build错误: 我在m2eclipse中构build错误,但是在命令行上没有使用maven2 – 我的m2eclipse是否configuration错误? )

我将删除该项目,然后再试一次,但是我想确保这次从开始就使用Java 1.6来查看这是否消除了构build问题。

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

m2eclipse插件不使用Eclipse的默认设置,m2eclipse插件从POM派生设置。 因此,如果您希望在Eclipse中导入时将Maven项目configuration为使用Java 1.6设置,请按照我的build议正确configurationmaven-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> 

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

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

我想添加一些东西给已经提供的答案。 maven-compiler-plugin默认会使用Java 1.5编译你​​的项目,这是m2e获取信息的地方。

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

我把这个添加到项目描述下的我的pom.xml文件中,

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

您的JRE可能在运行configuration中定义。 在Eclipse中按照以下步骤更改构buildJRE。

1)右键单击项目,然后select运行方式 > 运行configuration

2)从“运行configuration”窗口中,select左侧面板上的项目生成configuration。 在右边,你会看到各种标签:主,JRE,刷新,来源,…

3)点击JRE标签,你应该看到这样的东西

在这里输入图像说明

4)默认情况下,将使用工作默认JRE(在Preferences-> Java-> Installed JRE下select默认的JRE )。 如果您想使用其他已安装的JRE,请勾选Alternate JREcheckbox,然后从下拉列表中select您的首选JRE。

这里是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版本(Effective 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

遍历jar子和查找

plugin.xml中

文件夹内的文件

Maven的编译器插件-3.1.jar \ META-INF \行家\

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

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

祝你好运。

如果您正在使用TychoMaven构build捆绑包,并且在清单文件( manifest.mf )中定义了错误的执行环境( 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由于清单生成了旧的合规性级别。 我以为我分享经验。

项目特定的设置

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

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

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

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

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

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

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

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

通过closures项目,删除文件,然后作为Maven项目重新导入,我可以正确设置项目使用工作空间JRE或相关的jdk,而不会恢复到1.5。 因此,避免检查你的SVN的.project和.classpath文件

希望这可以帮助别人。

最简单的解决scheme

我会给你最简单的一个:

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

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

这应该做的。