我正在创建一个类似于Codingbat.com的程序。
在运行时,它需要编译代码,然后执行它。这些都已经处理好了。目前,我被迫使用JavacTool,这就要求它必须与之一起打包。
我有两个基本问题:
1)在可执行jar中运行时,如何阻止ToolProvider.getSystemJavaCompiler()返回null?
2)如果不能做到上述情况,有没有办法添加com.sun.tools.javac.api.JavacTool;的jar,而不是将它作为引用库,这样它就可以像常规导入一样工作?
感谢您的回答,如果您愿意,我可以上传带有被引用的库的Jar,以及没有它的jar。
为了清楚起见,使用引用库的jar可以工作,但是它太大了,而且比使用JavaCompiler而不是JavacTool的通过eclipse运行的jar要慢。
谢谢
编辑:
我很确定用java可以做到这一点,就像我以前见过的那样,但是忘记了在哪里和如何做到的。
发布于 2012-02-23 05:54:06
我怀疑这只是你运行哪个版本的Java的问题。如果运行JRE附带的版本,它将没有可用的工具。如果您运行JDK附带的版本,它将会。
举个例子,下面是一个简短但完整的程序:
import javax.tools.*;
public class Test
{
public static void main(String[] args)
{
System.out.println(ToolProvider.getSystemJavaCompiler());
}
}在我的笔记本电脑上用java.exe的JRE版本运行它:
c:\Users\Jon\Test>"\Program Files\java\jre7"\bin\java Test
null现在使用JDK:
c:\Users\Jon\Test>"\Program Files\Java\jdk1.7.0"\bin\java Test
com.sun.tools.javac.api.JavacTool@441944ae因此,请尝试显式指定与JDK关联的Java二进制文件。
发布于 2012-02-23 08:49:34
因此,您已经知道所有用户都将安装JDK,并且知道如何在Java程序中查找JDK的类路径。您不需要加载DLL。您需要在tools.jar中加载com.sun.tools.javac.api.JavacTool类。有关如何加载tools.jar的信息,请参见How to load a jar file at runtime
https://stackoverflow.com/questions/9403655
复制相似问题