当我使用javax.tools.JavaCompiler编译源代码时如何设置classpath?

Dia*_*.Wu 39 java jdk1.6 jsr199 java-compiler-api

我使用类javax.tools.JavaCompiler(jdk6)来编译源文件,但源文件依赖于某些jar文件.如何设置类路径javax.tools.JavaCompiler

Pas*_*ent 39

所述javax.tools.JavaCompiler#getTask()方法把一个options参数,允许设置编译器选项.以下消息描述了一种简单的方法来设置它们以访问调用程序的类路径:

您需要配置标准java文件管理器以了解jar文件 - 您使用编译器选项参数来执行此操作.

默认情况下,java编译器对象似乎只知道bootclasspath,extdirs和endorseddirs目录的类路径的默认位置.

您需要将调用程序的当前类路径添加到java编译器实例中,该实例将在标准文件管理器上传递,然后标准文件管理器将在jar文件中查找类.

这是我在编写的编译器包装器中的方法

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);
Run Code Online (Sandbox Code Playgroud)

所有你需要的是在运行调用程序时获得正确的类路径集.

  • BTW,`JavaCompiler`的`classpath`选项不"理解"通配符.所以每个`jar`你必须直接在这个字符串中添加. (2认同)

Wen*_*.Wu 5

最近我遇到了同样的问题,最后我找到了两个解决方法。您可以通过调用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)));` (2认同)