首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Janino编译java (破碎的Classpath)

用Janino编译java (破碎的Classpath)
EN

Stack Overflow用户
提问于 2016-01-13 14:25:28
回答 1查看 1.4K关注 0票数 4

我试图用Janino编译非常简单的类:

代码语言:javascript
复制
import org.codehaus.commons.compiler.CompileException;
import org.codehaus.janino.ClassBodyEvaluator;

import java.io.IOException;
import java.io.StringReader;

public class JaninoTest{

    public static void main(String[] args) throws IOException, CompileException {

        String sampleClass =
                "public class Test {" +
                    "public void sampleMethod() {\n" +
                    "        JsonObject obj = new JsonObject();\n" +
                    "        obj.add(\"p1\", new JsonPrimitive(2));\n" +
                    "        System.out.println(obj.get(\"p1\"));\n" +
                    "}" +
                "}";

        ClassBodyEvaluator classBodyEvaluator = new ClassBodyEvaluator();
        classBodyEvaluator.setParentClassLoader(Thread.currentThread().getContextClassLoader());
        classBodyEvaluator.setDefaultImports(new String[] {  "com.google.gson.JsonObject",
                "com.google.gson.JsonPrimitive"});
        StringReader sr = new StringReader(sampleClass);
        classBodyEvaluator.cook(null, sr);
        Class<?> clazz = classBodyEvaluator.getClazz();
        System.out.println(clazz.getName());

    }


}

这里的一切都很好,但是org.codehaus.janino.ClassBodyEvaluator编译器对Java 5有限制。

JANINO可以配置为使用javax.tools.JavaCompiler,即JAVAC,它消除了与Java 5相关的限制。

所以我在这个org.codehaus.commons.compiler.jdk.ClassBodyEvaluator;上修改了org.codehaus.commons.compiler.jdk.ClassBodyEvaluator;,它也可以在Janino网站上找到,而且AFAIK没有Java 5的限制。

但不幸的是,它抛出了以下堆栈跟踪:

代码语言:javascript
复制
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/main/Main$Result
    at com.sun.tools.javac.main.Main.compile(Main.java:581)
    at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
    at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
    at org.codehaus.commons.compiler.jdk.SimpleCompiler.cook(SimpleCompiler.java:128)
    at org.codehaus.commons.compiler.jdk.ClassBodyEvaluator.cook(ClassBodyEvaluator.java:197)
    at org.codehaus.commons.compiler.jdk.ClassBodyEvaluator.cook(ClassBodyEvaluator.java:108)
    at JaninoTest.main(JaninoTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.main.Main$Result
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 12 more 

这可能与编译器类路径有关,但我看不到API中有任何方法可以对其进行操作。

如有任何建议,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-12-14 06:21:37

为我工作。

代码语言:javascript
复制
    <dependency>
        <groupId>org.codehaus.janino</groupId>
        <artifactId>janino</artifactId>
        <version>3.1.6</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34769179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档