【问题标题】:How to set classpath when I use javax.tools.JavaCompiler compile the source?使用 javax.tools.JavaCompiler 编译源时如何设置类路径?
【发布时间】:2009-10-14 02:04:44
【问题描述】:

我使用类javax.tools.JavaCompiler (jdk6) 编译源文件,但是源文件依赖于一些jar 文件。如何设置javax.tools.JavaCompiler的classpath?

【问题讨论】:

    标签: java jdk1.6 java-compiler-api jsr199


    【解决方案1】:

    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);
    

    然后,您只需要在运行调用程序时设置正确的类路径。

    【讨论】:

    • Satheesh 将此作为答案发布,“您能否提前分享您的编译器包装器(链接不起作用),谢谢。”
    • 感谢一家工厂的这篇文章,我多年来一直在为此苦苦挣扎,这就是答案......干杯:)
    • 顺便说一句,classpathJavaCompiler 选项不“理解”通配符。所以每个jar你必须直接在这个字符串中添加。
    • this blog post 提供的解决方案对我帮助很大。它不适用于通过选项属性设置类路径。它实现了一个自定义文件管理器以从现有的类加载器(例如 Web 应用程序类加载器)加载类。
    • 这对我也有很大帮助。我在我的 Maven 项目中设置了一个复杂的 JUnit,我在其中动态创建 .java 文件。想办法继承当前的classpath,然后加一点。答案真的很明显;),但我不确定它是否可以在 Maven 和 Eclipse 中工作。
    【解决方案2】:

    最近我也遇到了同样的问题,最后我找到了两种解决方法。您可以通过调用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)));
    【解决方案3】:

    我需要比上面的例子更简单的东西。

    以下是使用内置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);
            }
            
            
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多