【问题标题】:Compiling Java 7 code via Maven通过 Maven 编译 Java 7 代码
【发布时间】:2012-12-12 03:45:22
【问题描述】:

我的 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 $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

当我运行 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

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

【问题讨论】:

  • 您的 PATH 的目录列表中没有 /usr/bin 第一个。在不指定目录的情况下尝试javac -version
  • @PeterLawrey,我得到javac 1.7.0_10
  • echo $JAVA_HOME 告诉你什么?
  • 你的 JAVA_HOME 变量呢? mvn 将使用 JAVA_HOME。另外,您是从命令行构建还是在 IDE 内部构建?
  • 如果您使用--debug 运行 Maven,它应该会告诉您它用于运行javac 的确切命令行(以及大量其他内容)。它说什么?

标签: java maven


【解决方案1】:

对于需要(非默认/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 和 Java 8。
【解决方案2】:

我在使用 eclipse 时遇到了这个问题,我不得不更改项目的构建路径,以便它引用 jre 7

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,为了解决这个问题,我关注了这篇博客文章: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
    

    特别感谢@mkyong

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

    【讨论】:

    • 这对我有用。我正在使用 mac,带有来自 macports 的 maven 和 sun jdk。显然这个组合很棘手。
    • 伟大的工作。感谢您的所有命令!现在可以在 Maveriks 上使用
    • 这是最简单、最优雅的解决方案。谢谢!
    【解决方案4】:

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

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

    它应该指向所需的jdk版本

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        尝试使用更新版本的 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 代码的消息一定会很快出现:-)

        【讨论】:

        • 添加“3.0”解决了这个问题。
        • @radai,现在是 3.2,但继续更新是愚蠢的,因为它永远不会停止增加......
        • @Lucas - 只是不想为那些坚持过时版本的人负责,仅此而已。无法忍受自己:-)
        • 当这个答案不是对所提出问题的正确解决方案时,为什么会有近百个赞成票?我迷路了……
        【解决方案7】:

        在 Eclipse 中右键单击您的项目并打开“运行配置”..检查那里的 jre 版本。 有时这在 Eclipse 中默认不会改变,甚至在构建路径中更改版本之后。

        【讨论】:

          【解决方案8】:

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

          需要删除正在构建的目录。干净的。然后重新安装。看起来像是静默权限问题。

          【讨论】:

            【解决方案9】:

            您可能指定了错误的 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>
            

            【讨论】:

              【解决方案10】:

              诊断:

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

              Debian 解决方案:

              mvn 脚本通过查找 javac(哪个 javac)在内部设置 JAVA_HOME 环境变量。因此,如果您同时安装了多个 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 工具的替代品(大约有十几个)。

              【讨论】:

              • 谢谢,正是我要找的东西
              • 谢谢,我在设置java版本后很困惑:update-alternatives --config javac
              【解决方案11】:

              我遇到了同样的问题。我发现这是因为 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 这是正确的答案
              【解决方案12】:

              不确定这里使用的是什么操作系统,但是您可以使用 update-java-alternatives 来消除很多 java 版本,使用 update-java-alternatives 设置默认的 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。

              【讨论】:

                【解决方案13】:

                尝试在 Eclipse 的 Properties 中更改 Java 编译器设置-

                转到:首选项->Java->编译器->编译器合规级别-> 1.7 申请 好的

                重启 IDE。

                确认项目的编译器设置- 转到:Project Properties->Java Compiler->Uncheck(Use Compliance from execution environment 'JavaSE-1.6' on the java Build path.) 并从下拉列表中选择 1.7。 (如果已经是 1.7 则忽略)

                重启 IDE。

                如果问题仍然存在-使用终端中的命令运行单个测试用例-

                mvn -Dtest=<test class name> test
                

                【讨论】:

                  【解决方案14】:

                  您必须检查 Maven 版本:

                  mvn -version
                  

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

                  【讨论】:

                    【解决方案15】:

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

                    【讨论】:

                    • 您不应该在任何将被共享的代码上硬编码路径。
                    • @Jan Segre,好的,我改了 :)
                    【解决方案16】:

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

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

                    【讨论】:

                      【解决方案17】:

                      检查 maven 安装中的 mvn 脚本,了解它是如何构建命令的。也许您或其他人在其中硬编码了 JAVA_HOME 并忘记了它。

                      【讨论】:

                      • 你先生是赢家。确实有人在脚本中硬编码 JAVA_HOME !谢谢你
                      • 嘿,我以前从来没有对自己做过这样的事...... :)
                      • mvn 脚本与我的 OSX 安装的 Oracle 的 JDK 7 不兼容,我没有做任何花哨的设置(该脚本查找文件夹 Library/Java/JavaVirtualMachines/CurrentJDK,它没有'对我来说不存在(确实存在的是jdk1.7.0_25.jdk而不是CurrentJDK)。不是一个优雅的修复,但我只是对导出进行硬编码,现在它可以工作了(PS:OSX上的maven位于/usr/share/maven/bin/mvn
                      • OSX 1.9.2 mavericks,通过 homebrew 安装了 maven,mvn 脚本位于/usr/local/bin/mvn
                      • 我有一个 JAVA_HOME 集,这给出了线索​​。谢谢!! :D
                      【解决方案18】:

                      你能试试更新的插件吗?在 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 -
                      • 我之前已经成功使用 2.3.2 编译过 1.7...但是如果可能的话最好使用最新的。
                      • 进一步搜索。如果您使用它,请检查您的依赖插件管理。
                      • 添加了 ,同样的问题
                      • 如果是模块项目,父项目可能值得研究。 This 不能在这里。 maven 是否使用 java 1.7 运行?
                      猜你喜欢
                      • 1970-01-01
                      • 2017-04-20
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-03-21
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多