我为在 Ubuntu 11.04 服务器发行版上运行的项目安装了sun-java6-jdk
和sun-java6-jre
(可能还有其他相关的 java6 包,例如字体)。我们的项目以编程方式从正在运行的可执行文件中调用 Javadoc。为此,我们显然需要知道 tools.jar 文件的位置,该文件是 JDK 发行版的一部分,但不是 JRE 发行版的一部分。这些包被安装到/usr/lib/jvm/java-6-sun-1.6.0.26/
,在两个区域(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
答案1
好吧,这是个 hack,但我们最终将tools.jar
文件复制到jre/lib/ext
目录中,就像安装第三方 jar 文件作为扩展一样。这似乎是一个不自然的动作,我们应该通过选项在命令行上执行某些操作-cp
(试过但失败了),或者通过环境变量执行某些操作(也试过但失败了)。