【问题标题】:How to use JavaCompiler from tools.jar without JDK如何在没有 JDK 的情况下使用 tools.jar 中的 JavaCompiler
【发布时间】:2019-04-16 22:51:32
【问题描述】:

我正在尝试创建一个可以在运行时编译提供的.java 文件的应用程序。我知道在 JDK 的tools.jar 中有一个可用的程序编译器。但是,我不能保证应用程序的用户有 JDK。我试图在应用程序中打包tools.jar 并将其作为库引用。当我将tools.jar 添加到类路径的引导条目中时,这似乎在 Eclipse IDE 中起作用。将应用程序导出到可运行的 jar 时(与 tools.jar 一起打包), ToolProvider.getSystemJavaCompiler(); 返回null。我不确定问题是什么,但我认为这可能与应用程序导出到可运行 jar 时类路径的引导条目没有正确保留有关。有任何想法吗?我可以使用tools.jar 编译器的替代品吗?感谢您的耐心等待,因为这是我在这里发布的第一个问题!

【问题讨论】:

    标签: java eclipse classpath javacompiler tools.jar


    【解决方案1】:

    您需要在“tools.jar”中使用编译器

    ToolProvider.getSystemJavaCompiler()
    

    将从path变量中定义的jdk返回编译器, 你可以这样做:

    File file = new File(pathToToolsJar);
    URL[] urls = new URL[]{ file.toURI().toURL() };
    ClassLoader loader = new URLClassLoader(urls);
    Class compilerClass = loader.loadClass("com.sun.tools.javac.api.JavacTool");
    JavaCompiler compiler = (JavaCompiler) compilerClass.getConstructor().newInstance();
    

    或者您可以在编译时将 tools.jar 添加为库

    import com.sun.tools.javac.api.JavacTool;
    ...
    JavaCompiler compiler = new JavacTool();
    

    或者您可以更改系统属性,但这会导致意外行为

    【讨论】:

    • 感谢您的快速响应。这似乎完美无缺。我有没有机会简要解释一下替代方案的作用?
    • 嗯,我不太确定为什么我建议使用反射,您可以将 tools.jar 添加为库并以旧方式实例化它import com.sun.tools.javac.api.JavacTool;JavaCompiler compiler = new JavacTool();
    • 我最初的建议是在运行时使用反射加载 tools.jar;使用 URLClassLoader 是一种在运行时加载依赖项的简单方法,您只需向加载器询问您想要的类,它会在您为类指定的 url 中查找
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2019-11-15
    • 2013-06-30
    • 2015-08-09
    相关资源
    最近更新 更多