是什么导致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>
祝你好运。
如果您正在使用Tycho和Maven构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中,另一个可能出错的地方是项目特定的设置。
-
项目属性:单击您的项目,然后select以下选项之一:
- Alt + Enter
- 菜单>项目>属性
- 右键单击您的项目>项目属性(菜单中的最后一项)
-
点击“Java编译器”
- 取消选中“启用项目特定设置”(或者全部手动更改)。
由于客户的要求,我们让他们把我们的项目保持在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
这应该做的。