是什么原因导致Eclipse中的导入Maven项目默认使用Java 1.5而不是Java 1.6,我怎样才能确保它没有?

问题描述 投票:207回答:12

我导入了一个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?

java eclipse maven-2 m2eclipse build-error
12个回答
242
投票

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

我发现我的问题是有人提交了文件.project和.classpath,它们将Java1.5作为默认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>

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

希望这有助于其他人。


0
投票

如果要确保Eclipse中新创建的项目或导入的项目使用的是另一个默认java版本而不是Java 1.5,则可以更改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
  • 在以下几行中: <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.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/


0
投票

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

1-项目>属性 2-转到Java Build Path 3-在Libraries中,选择JRE System ...并单击Edit 4-选择合适的版本并进行验证


30
投票

我将它添加到项目描述下面的pom.xml中并且它有效:

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

28
投票

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

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


26
投票
<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>

6
投票

您的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.hml

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

穿过罐子然后找出答案

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>

查看上面的代码,找出以下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>

祝好运。


2
投票

Project specific settings

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

  1. 项目属性:单击您的项目,然后执行以下操作之一: Alt + Enter 菜单>项目>属性 右键单击项目>项目属性(菜单中的最后一项)
  2. 点击“Java编译器”
  3. 取消选中“启用项目特定设置”(或手动更改所有设置)。

由于客户的要求,我们让他们能够将我们的项目保持在1.6。当需要升级到1.7时,我们很难,因为我们需要在整个地方更改java版本:

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

2
投票

Spring Boot中最简单的解决方案

如果你使用Spring Boot,我会给你最简单的一个:

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

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

那应该做。


1
投票

如果你使用Tycho和Maven来构建bundle,还有一个可能的原因,你在清单文件(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因为清单而生成旧的合规级别。我以为我分享经验。

© www.soinside.com 2019 - 2024. All rights reserved.