web-dev-qa-db-ja.com

Sun-Java-6 tools.jarを見つける際の不正なクラスパス/Java.home問題

Ubuntu 11.04サーバーディストリビューションで実行されているプロジェクトにSun-Java6-jdkSun-Java6-jre(およびフォントなどの関連する他のJava6パッケージ)をインストールしました。私たちのプロジェクトは、実行中の実行可能ファイル内からプログラムによってJavadocを呼び出します。これを行うには、JREディストリビューションではなく、JDKディストリビューションの一部であるtools.jarファイルの場所を明らかにする必要があります。パッケージは/usr/lib/jvm/Java-6-Sun-1.6.0.26/にインストールされ、2つの領域(JDK/JRE)の下にbinおよびその他のディレクトリがあり、さまざまな標準バイナリが提供されます。

Javaプログラムを実行するときは常に(Javaバイナリを介して)、内部のJava.home変数が、提供されたJava_HOME環境変数を上書きするようです。したがって、バイナリはそのバイナリのパスからそのJava.homeを導出します。jdkの下のJavaバイナリは、実際にはjreバージョンへのリンクです。したがって、どれを「実行」しても、常にjreバージョンを取得しているため、Java.homeディレクトリは/usr/lib/jvm/Java-6-Sun-1.6.0.26/jreと定義されています。

そのため、実行中の実行可能ファイルはtools.jarファイルを見つけることができず、-cp /usr/lib/jvm/Java-6-Sun-1.6.0.26/jdk/lib/tools.jarオプションを渡しても役に立ちません。 tools.jarファイルに正しくアクセスして、com.Sun.tools.javadoc.Main.executeメソッドを正しく呼び出せるようにする方法を誰かに明かしてもらいたいと思っています。

実行例:

Java -cp /usr/lib/jvm/Java-6-Sun/lib/tools.jar -jar comtor.jar -sourcepath .

Exception in thread "main" Java.lang.NoClassDefFoundError: com/Sun/tools/javadoc/Main
    at comtor.Comtor.main(Unknown Source)
Caused by: Java.lang.ClassNotFoundException: com.Sun.tools.javadoc.Main
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:306)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:247)
    ... 1 more
2
docSquale

まあ、それはハックですが、サードパーティのjarファイルを拡張機能としてインストールしているかのように、tools.jarファイルをjre/lib/extディレクトリにコピーしてしまいました。これは不自然なアクションのようで、-cpオプション(試行して失敗した)または環境変数(試行して失敗した)を介してコマンドラインで何かをする必要があります。

1
docSquale