通过Maven编译Java 7代码

Jam*_*sev 156 java maven

我的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>
  ...
Run Code Online (Sandbox Code Playgroud)

不过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>
Run Code Online (Sandbox Code Playgroud)

/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)
Run Code Online (Sandbox Code Playgroud)

javac 也指向正确的Java版本

/usr/bin/javac -> /Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home/bin/javac
Run Code Online (Sandbox Code Playgroud)

在这台机器上,我正在使用zsh(echo $0返回-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
Run Code Online (Sandbox Code Playgroud)

当我运行时,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
Run Code Online (Sandbox Code Playgroud)

哪里可以定义?我有多次来源(d)我的.zshrc.

Rya*_*art 153

检查mvnmaven安装中的脚本,看看它是如何构建命令的.也许你或其他人JAVA_HOME在那里硬编码并忘记了它.

  • 嘿,不是说我以前做过那件事或者其他事情...... :) (21认同)
  • 你先生是胜利者.确实有人在脚本中硬编码JAVA_HOME!谢谢 (8认同)
  • OSX 1.9.2 mavericks,通过自制软件安装maven,mvn脚本位于`/ usr/local/bin/mvn` (6认同)
  • `mvn`脚本与我的Oracle JDK 7的OSX安装不兼容,我没有做任何花哨的设置(脚本查找不存在的文件夹`Library/Java/JavaVirtualMachines/CurrentJDK`)对我来说(确实存在的是`jdk1.7.0_25.jdk`而不是`CurrentJDK`).不是一个优雅的修复,但我刚刚硬编码导出,现在它可以工作(PS:OSX上的maven在`/ usr/share /行家/斌/ mvn`) (4认同)

rad*_*dai 109

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

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>
Run Code Online (Sandbox Code Playgroud)

另外,在maven中指定源文件编码在全局范围内更好:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Run Code Online (Sandbox Code Playgroud)

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


eli*_*ati 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
Run Code Online (Sandbox Code Playgroud)

特别推荐给@mkyong

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

  • 这对我有用.我正在使用mac,maven来自macports和sun jdk.显然这个组合很棘手. (3认同)

小智 26

请检查pom.xml以获取以下标签

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>
Run Code Online (Sandbox Code Playgroud)

它应该指向所需的jdk版本


小智 19

你必须检查Maven版本:

mvn -version
Run Code Online (Sandbox Code Playgroud)

您将找到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
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)