6

最近、Macbook Pro で Java7 にアップグレードしました。JDK をダウンロードしました (JRE ではありません)。

» javac version
javac 1.7.0_17

» echo $JAVA_HOME    
/Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home

ただし、ビルドを実行しようとすると、Maven コンパイラ プラグインの 1 つが失敗し、JRE がインストールされていると主張します。

» mvn install
[ERROR] execute error
org.apache.maven.plugin.MojoExecutionException: You need to run build with JDK
 or have tools.jar on the classpath.
If this occures during eclipse build make sure you run eclipse under JDK as well
    at com.mysema.maven.apt.AbstractProcessorMojo.execute(AbstractProcessorMojo.java:263)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)

明らかにJDKがインストールされているため、混乱しています。私MAVEN_OPTSは面白いことは何もしません:

» echo $MAVEN_OPTS          
-Xmx512m

デバッグしようとして、次のことを行っている問題のプラグインのソースを確認しました。

    try {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        if (compiler == null) {
            throw new MojoExecutionException("You need to run build with JDK or have tools.jar on the classpath."
                    + "If this occures during eclipse build make sure you run eclipse under JDK as well");
        }

それは無害に思えるので、コマンド ライン env に何か問題があるのではないかと疑って、簡単なテストを作成しました。

// Main.java
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


public class Main {

    public static void main(String[] args) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        if (compiler == null)
        {
            System.out.print("Compiler is null");
        } else {
            System.out.print("Compiler is not null");
        }
    }

}

» javac Main.java

Main.java:1: cannot access javax.tools.JavaCompiler
bad class file: /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Home/jre/lib/rt.jar(javax/tools/JavaCompiler.class)
class file has wrong version 51.0, should be 49.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
import javax.tools.JavaCompiler;
                   ^
1 error

そのエラーを正しく理解していれば、Java5 に対して Java7 コンパイラが実行されていることを示唆していrt.jarますか?

ここで何が起こっているのかわかりません。

明らかにJava7 JDKがインストールされていますが、理解できません:

  • Maven プラグインがコンパイラに対して null を返すのはなぜですか?
  • クラス バージョン エラーが発生するのはなぜですか?

アップデート

回答は、JRE / JDKのインストールがめちゃくちゃであることを示唆しています。これは可能性が高いと思われることに同意しますが、犯人がどこにいるかを追跡するのに苦労しています.

いくつかの追加情報:

» which javac
/usr/bin/javac

ls -ltra /usr/bin/javac
/usr/bin/javac -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/javac

cd /System/Library/Frameworks/JavaVM.framework/Versions
ls -ltra

lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.6.0 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.6 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.5.0 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.5 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.4.2 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.4 -> CurrentJDK
drwxr-xr-x   8 root  wheel  272 18 Feb 08:39 A
drwxr-xr-x  11 root  wheel  374 18 Feb 08:39 ..
lrwxr-xr-x   1 root  wheel    1 14 Jun 11:14 Current -> A
lrwxr-xr-x   1 root  wheel   58 14 Jun 11:15 CurrentJDK -> /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents
drwxr-xr-x  11 root  wheel  374 14 Jun 11:15 .

したがって、実行中の javac は にインストールされたものA/Commandsです。これが正しいかどうかはわかりません。私のWindows時代からは間違っているように思えますが、MacがJavaインストールをいじくり回す方法についてはよく知りません。

私の$JAVA_HOMEポイント/Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Homeは、次のとおりです。

drwxrwxr-x  10 root  wheel       340  5 Feb 08:10 jre
-rw-rw-r--   1 root  wheel    123324  5 Feb 08:10 THIRDPARTYLICENSEREADME-JAVAFX.txt
drwxrwxr-x   5 root  wheel       170  5 Feb 08:10 man
drwxrwxr-x   9 root  wheel       306  2 Mar 02:10 db
-rw-rw-r--   1 root  wheel      3339  2 Mar 02:10 COPYRIGHT
drwxrwxr-x   9 root  wheel       306  2 Mar 02:10 include
-rw-rw-r--   1 root  wheel  19997030  2 Mar 02:10 src.zip
-rw-rw-r--   1 root  wheel       447  2 Mar 02:10 release
-rw-rw-r--   1 root  wheel    172252  2 Mar 02:10 THIRDPARTYLICENSEREADME.txt
-rw-rw-r--   1 root  wheel       114  2 Mar 02:10 README.html
-rw-rw-r--   1 root  wheel        40  2 Mar 02:10 LICENSE
drwxrwxr-x   5 root  wheel       170  2 Mar 02:10 ..
drwxrwxr-x  15 root  wheel       510  2 Mar 02:13 .
drwxrwxr-x  13 root  wheel       442  2 Mar 02:13 lib
drwxrwxr-x  43 root  wheel      1462  2 Mar 02:13 bin
4

8 に答える 8

9

tools.jar座っているのを見つけた/Library/Java/Extensions

これが標準かどうかはわかりません。

ただし、tools.jarJDK7$JAVA_HOME/libからをコピーすると、/Library/Java/Extensionsすべての問題が解決しました。

CurrentSDKまた、元の質問で、Javaを次のように更新したことも指摘しておく必要がありますJDK7

CurrentJDK -> /Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents

ここで指摘されているように、これは悪い考えでした。

これを更新して、1.6 を指すようにしました。これは直感に反するように思えますが、物事を機能させるために必要でした。

/System/Library/Frameworks/JavaVM.framework/VersionsJDK を使用した現在のリストは1.7次のようになります。

lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.6.0 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.6 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.5.0 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.5 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.4.2 -> CurrentJDK
lrwxr-xr-x   1 root  wheel   10 18 Feb 08:36 1.4 -> CurrentJDK
drwxr-xr-x   8 root  wheel  272 18 Feb 08:39 A
drwxr-xr-x  11 root  wheel  374 18 Feb 08:39 ..
lrwxr-xr-x   1 root  wheel    1 14 Jun 11:35 Current -> A
lrwxr-xr-x   1 root  wheel   59 14 Jun 12:31 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents
drwxr-xr-x  11 root  wheel  374 14 Jun 12:31 .
于 2013-06-14T03:18:44.703 に答える
1

同様の問題があり、別のスレッドで答えを見つけました:

Java のバージョンを変更しようとしているときに OSX でシンボリック リンクが台無しになる

JAVA_HOME を次のように設定します。

export JAVA_HOME=/Library/Java/Home

そしてそれは今働いています。

于 2013-07-25T16:11:10.567 に答える
1

tools.jarinが JDK の正しいバージョンのものではないことがわかった場合/Library/Java/Extensionsは、そこに tools.jar がなく、tools.jar があるように$JAVA_HOME/lib(前の応答で設定されているように) 邪魔にならないように移動します。

例えば

cd 
sudo mv /Library/Java/Extensions/tools.jar tools.jar.safe
于 2014-01-24T09:56:47.527 に答える
1

ほとんどの場合、javac は JDK ではなく JRE から実行されています。tools.jar は JDK でのみ使用できます。を使用して javac/java のパスを確認します。which

which javac

正しい Java7 バージョンを Java プリファレンス (ラウンチャパッド/その他) の一番上にドラッグします。これは、A が JDK7 を指すようにする必要があります。

于 2013-06-14T00:53:39.933 に答える