【发布时间】:2009-10-14 02:04:44
【问题描述】:
我使用类javax.tools.JavaCompiler (jdk6) 编译源文件,但是源文件依赖于一些jar 文件。如何设置javax.tools.JavaCompiler的classpath?
【问题讨论】:
标签: java jdk1.6 java-compiler-api jsr199
我使用类javax.tools.JavaCompiler (jdk6) 编译源文件,但是源文件依赖于一些jar 文件。如何设置javax.tools.JavaCompiler的classpath?
【问题讨论】:
标签: java jdk1.6 java-compiler-api jsr199
javax.tools.JavaCompiler#getTask() 方法采用允许设置编译器选项的options 参数。以下message 描述了一种设置它们以访问调用程序的类路径的简单方法:
您需要配置标准 java文件管理器了解一下 jar 文件 - 您使用编译器 选项参数来做到这一点。
默认情况下java编译器对象 似乎只知道默认值 bootclasspath、extdirs 的位置 和 endorseddirs 目录 它的类路径。
您需要添加调用程序的 java编译器的当前类路径 被传递的实例 标准文件管理器,它将 然后在 jar 文件中查找类。
这是我在the compiler wrapper I wrote 中的做法
List<String> optionList = new ArrayList<String>(); // set compiler's classpath to be same as the runtime's optionList.addAll(Arrays.asList("-classpath",System.getProperty("java.class.path"))); // any other options you want optionList.addAll(Arrays.asList(options)); JavaCompiler.CompilationTask task = compiler.getTask(out,jfm,diagnostics,optionList,null,jfos);
然后,您只需要在运行调用程序时设置正确的类路径。
【讨论】:
classpath 的 JavaCompiler 选项不“理解”通配符。所以每个jar你必须直接在这个字符串中添加。
最近我也遇到了同样的问题,最后我找到了两种解决方法。您可以通过调用StandardJavaFileManager.setLocation(StandardLocation.CLASS_PATH, "YOUR_CLASS_PATH") 或Compiler.getTask(ARG_0, ARG_1, ARG_2, CLASS_PATH_OPTIONS, 来设置类路径,就像这里发布的第一个答案所说的那样。
【讨论】:
StandardJavaFileManager.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(new File(classpath)));
我需要比上面的例子更简单的东西。
以下是使用内置Java编译器的自包含示例,并设置编译器使用的类路径。
相当于创建一个名为HelloPrinter.java的源文件,然后编译如下:
javac -classpath C:\Users\dab\Testing\a.jar;c:\path\etc org\abc\another\HelloPrinter.java
注意如何使用 String[] 选项设置类路径。如果您已经习惯在命令行上运行 javac(如上),这应该很熟悉。
此代码与 Java 6 兼容。您需要 JDK 而不是 JRE 才能运行此代码。此示例实际上并未使用类路径。它所做的就是打印“Hello”。您可以在生成的源代码中添加 import 语句并调用外部 Jar 文件中的方法来正确测试。
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class JavaCompilerExample {
public static void main(String[] args) throws Exception {
String className = "HelloPrinter";
String directoryName = "org/abc/another";
new File(directoryName).mkdirs();
FileOutputStream fos = new FileOutputStream(directoryName+"/"+className+".java");
PrintStream ps = new PrintStream(fos);
ps.println(
"package "+directoryName.replace("/", ".") + " ; "
+ "public class " +className +
"{ public static void main(String[] args){System.out.println(\"Hello\");} }");
ps.close();
JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
String javacOpts[] = {"-classpath",
"C:\\Users\\dab\\Testing\\a.jar;c:\\path\\etc;",
directoryName+"/"+className + ".java"};
if ( javac.run(null, null, null, javacOpts)!=0 ) {
System.err.println("Error");
System.exit(1);
}
}
}
【讨论】: