通过Maven编译Java 7代码


155

我的pom文件列表

<project>
  <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
  ...

然而mvn clean install,我得到

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.7
Usage: javac <options> <source files>

/usr/bin/java -version是(which java点在这里)

java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

javac 也指向正确的Java版本

/usr/bin/javac -> /Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home/bin/javac

在这台机器上,我正在使用zshecho $0return -zsh

在我的中.zshrc,我定义了:

 33 # HOME
 34 JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home
 35 SCALA_HOME=/Library/Scala/current
 36 FORGE_HOME=~/tools/forge/
 37 
 38 # PATH
 39 PATH="/Library/Frameworks/Python.framework/Versions/3.2/bin:${PATH}"
 40 PATH=${PATH}:${JAVA_HOME}/bin
 41 PATH=${PATH}:/bin/
 42 PATH=${PATH}:/sbin/
 43 PATH=${PATH}:/usr/bin/
 44 PATH=${PATH}:/usr/sbin/
 45 PATH=${PATH}:/opt/local/bin/
 46 PATH=${PATH}:/opt/local/sbin/
 47 PATH=${PATH}:/usr/local/git/bin
 48 PATH=${PATH}:/usr/local/git/sbin
 49 PATH=${PATH}:/Applications/Xcode.app/Contents/Developer/usr/bin
 50 PATH=${PATH}:${SCALA_HOME}/bin
 51 PATH=${PATH}:${FORGE_HOME}/bin
 52 
 53 export PATH

在运行时,mvn clean install --debug我发现实际上我在使用Java 6

  1 Apache Maven 3.0.3 (r1075438; 2011-02-28 11:31:09-0600)
  2 Maven home: /usr/share/maven
  3 Java version: 1.6.0_35, vendor: Apple Inc.
  4 Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

在哪里可以定义?我的.zshrc有多次source(d)。


2
您的PATH /usr/bin在目录列表中没有第一位。尝试javac -version不指定目录。
彼得·劳里

@PeterLawrey,我明白了javac 1.7.0_10
James Raitsev

2
是什么echo $JAVA_HOME告诉你吗?
Andrew Logvinov 2012年

2
那么您的JAVA_HOME变量呢?mvn将使用JAVA_HOME。另外,您是从命令行还是在IDE中进行构建?
卢卡斯

8
如果您使用来运行Maven --debug,它应该告诉您它用来运行的确切命令行javac(以及大量其他内容)。它说什么?
埃米尔(Emil Sit)

Answers:


153

检查mvn您的maven安装中的脚本,以查看其如何构建命令。也许您或其他人已经JAVA_HOME在其中进行了硬编码而忘记了它。


8
先生,您是赢家。确实有人在脚本中硬编码了JAVA_HOME!谢谢您
詹姆斯·赖兹夫

21
嘿,不是我以前曾经对自己做到过……:)
瑞安·斯图尔特

4
mvn脚本与我的Oracle JDK 7的OSX安装不兼容,并且我没有做任何花哨的设置(该脚本查找Library/Java/JavaVirtualMachines/CurrentJDK对我而言不存在的文件夹(存在的是jdk1.7.0_25.jdk而不是CurrentJDK)。优雅的修复程序,但我只是对导出进行了硬编码,现在可以正常工作(PS:OSX上的Maven在/usr/share/maven/bin/mvn
Raekye

6
OSX 1.9.2特立独行者,通过自制程序安装了maven,mvn脚本位于/usr/local/bin/mvn
StackExchange What Heck

1
我设置了JAVA_HOME,这给出了线索​​。谢谢!!:D
阿方索西川

109

尝试使用更新版本的Maven编译器插件:

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>

另外,最好在全局中指定在maven中进行源文件编码:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

编辑:由于这个答案仍然受到关注,我只想指出,最新的值(截至最新编辑)对于maven编译器插件是3.2,对于Java是1.8,因为有关通过maven编译Java 8代码的问题即将出现:-)


添加“ <version> 3.0 </ version>”解决了该问题。
Sriram

@radai,目前为3.2,但是傻傻地不断更新,因为它永远不会停止增加……
卢卡斯

@Lucas-只是不想对坚持使用过时版本的人负责,仅此而已。无法与自己同住:-)
radai 2014年

如果不是对提出的问题的正确解决方案,为什么这个答案几乎有一百票赞成票?我迷路了…
Zero3 '16

48

我遇到了同样的问题,为了解决这个问题,我关注了此博客文章:http : //www.mkyong.com/java/how-to-set-java_home-environment-variable-on-mac-os-x/

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

特殊tks @mkyong

编辑:现在我正在使用:jEnv + sdkman


3
这对我有用。我正在使用Mac,Macports和Sun JDK中都有Maven。显然,组合很棘手。
Quantum7年

1
做得好。感谢您的所有命令!现在在Maveriks上工作
Maksim

1
这是最简单,最优雅的解决方案。谢谢!
BK-

26

请检查您的pom.xml以下标签

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

它应该指向所需的JDK版本


19

您必须检查Maven版本:

mvn -version

您将找到Maven用于编译的Java版本。如果需要,您可能需要重置JAVA_HOME。


19

我有同样的问题。我发现这是因为Maven脚本查看了下面的CurrentJDK链接并找到了1.6 JDK。即使您安装了最新的JDK,也无法解决。尽管您可以在$ HOME / .bash_profile脚本中设置JAVA_HOME,但是我选择修复符号链接,如下所示:

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/
total 64
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6.0 -> CurrentJDK
drwxr-xr-x  9 root  wheel  306 11 Nov 21:20 A
lrwxr-xr-x  1 root  wheel    1 30 Oct 16:18 Current -> A
lrwxr-xr-x  1 root  wheel   59 30 Oct 16:18 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

请注意,CurrentJDK指向1.6.0.jdk

要修复它,我运行了以下命令(您应检查已安装的版本并进行相应调整)。

sudo rm /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/ /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK

如果mvn clean install -debug显示Java 1.6,这是正确的答案
Cetnar 2014年

4

诊断:

您可以通过运行“ mvn --version”来查看Maven使用的Java版本。

Debian解决方案:

mvn脚本通过查找javac(哪个javac)在内部设置JAVA_HOME env变量。因此,即使同时安装了多个Java版本(例如JDK 6和JDK 7),并使用Debian Alternatives系统在它们之间进行选择,即使您将“ java”的替代版本更改为JDK 7,mvn仍将使用JDK 6。也必须更改“ javac”的替代项。例如:

# update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac

编辑:

实际上,一个更好的解决方案是使用update-java-alternatives(例如)

# update-java-alternatives -s java-1.7.0-openjdk-amd64

https://wiki.debian.org/JavaPackage中所述,因为这将更改各种Java工具(大约有十几种)的所有替代方法。


谢谢,正是我想要的
evandongen 2014年

谢谢,我在设置Java版本后感到困惑:update-alternatives --config javac
Leonard Saers 2014年

2

您可以尝试更新的插件吗?在Maven网站上:

<version>3.0</version>

我也看到了以下内容:

<compilerVersion>1.7</compilerVersion>

不起作用。[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on project divs: Fatal error compiling: invalid target release: 1.7 -
James Raitsev

我之前已经成功地使用2.3.2来编译1.7。但是如果可能的话,最好总是使用最新的。
卢卡斯

进一步搜索。如果使用它,请检查依赖插件管理。
Joop Eggen 2012年

添加了<pluginDependency>,相同的问题
James Raitsev

如果它是一个模块项目,那么父项目可能值得研究。这里不是这种情况。Maven是否与Java 1.7一起运行?
乔普·艾根

2

尝试在Eclipse中的“属性”中更改Java编译器设置

转到:首选项-> Java->编译器->编译器符合性级别-> 1.7 Apply确定

重新启动IDE。

确认项目的编译器设置-转到:项目属性-> Java编译器->取消选中(在Java Build路径上使用执行环境'JavaSE-1.6的Compliance。),然后从下拉列表中选择1.7。(如果已经是1.7,则忽略)

重新启动IDE。

如果问题仍然存在,请在终端中使用命令运行个别测试用例,

mvn -Dtest=<test class name> test

2

不知道这里使用的是什么操作系统,但是您可以使用update-java-alternatives消除很多java版本的un debian / ubuntu来设置默认的jvm系统范围。

#> update-java-alternatives -l
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64
java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64
java-6-sun 63 /usr/lib/jvm/java-6-sun
java-7-oracle 1073 /usr/lib/jvm/java-7-oracle

要设置一个新的,使用:

#> update-java-alternatives -s java-7-oracle

无需为大多数应用设置JAVA_HOME。


2

右键单击eclipse中的ur项目,然后打开“运行配置”。.检查那里的jre版本。有时,即使在buildpath中更改版本后,默认情况下在eclipse中也不会更改。


2

对于需要(非默认/etc/alternatives/java)JVM 的特定编译,请考虑在mvn命令前加上JAVA_HOME这样的前缀,

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ mvn package

在这里,我们假定默认值为Java 8,而对于手头的特定项目,我们需要Java 7。


这对我来说效果最好,因为这样就不必对从GIT(或SCM)下载的
project6

这个答案值得更多的赞扬。它帮助我在默认机器为Java 8的计算机上编译了要求Java 7的代码,而无需安装和重新安装Java7和
Java8。– R11G,

1

{JAVA_1_4_HOME} / bin / javac您也可以尝试...

<plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <executable>{JAVA_HOME_1_7}/bin/javac</executable>
                <fork>true</fork>
        </configuration>
    </plugin>

4
您不应在将要共享的任何代码上对路径进行硬编码。
2013年

@Jan Segre,好吧,我将其更改:)
baybora.oren 2014年

0

好的,我也自己解决了这个问题。JAVA_HOME更重要,如果与Maven插件的源/目标属性相比,您没有更低的版本或没有更低的版本,则会收到此错误。

确保在JAVA_HOME中有一个好的版本,并将其包含在PATH中。


0

您可能指定了错误的Java版本。java -version(在您的终端中)以检查您正在使用的Java版本。转到maven-compile-plugin以获取最新的maven编译器版本。如果您使用的是Java 6,并且最新版本的maven编译器插件为3.1,则您的插件可能会显示如下:

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

0

先前的答案都没有完全解决我的用例。

需要删除正在构建的目录。清洁。然后重新安装。看起来像是无提示权限问题。


0

在进入文件菜单->项目结构,将项目SDK更改为1.7,将项目语言级别更改为7之前,我在IntelliJ IDEA 14中遇到了此问题。


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.