javax.tools.JavaCompiler设置类路径

时间:2015-07-07 15:42:28

标签: java minecraft bukkit

我正在尝试为 Minecraft Spigot插件编写脚本系统,我不太确定如何从我的主jar文件中提供我的脚本信息。

使用这个当前代码,它将编译脚本正常但在线上给我一个错误" 3" Compass.java文件(类声明)。从我看到的程序不知道" com.deft.core.scripts.DeftScript"是,我不太确定如何告诉它这个信息。

如果相关的

,我从this线程获得了编译代码

编写脚本:

    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);

    List<String> optionList = new ArrayList<String>();
    optionList.add("-classpath");
    optionList.add(System.getProperty("java.class.path") + ";dist/Deft-Core.jar");


    Iterable<? extends JavaFileObject> compilationUnit = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(script));
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null, compilationUnit);
    if (task.call()) {
        Object obj = null;
        try {
            URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("./plugins/Deft-Core/").toURI().toURL()});
            Class<?> loadedClass;
            loadedClass = classLoader.loadClass("scripts.Compass");
            obj = loadedClass.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }


        if (obj instanceof DeftScript) {
            DeftScript deftScript = (DeftScript)obj;
            deftScript.onEnable(this);
        }
    } else {
        for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) {
            System.out.format("Error on line %d in %s%n", diagnostic.getLineNumber(), diagnostic.getSource().toUri());
        }
    }

Compass.java

package scripts;

public class Compass extends com.deft.core.scripts.DeftScript {
    @Override
    public void onEnabled() {
    }
}

DeftScript.java

package com.deft.core.scripts;

public abstract class DeftScript {
    public abstract void onEnable();
}

com.deft.core.scripts.DeftScript是我试图从主jar文件扩展的源。

我很确定我的问题出在这里的某个地方:

List<String> optionList = new ArrayList<String>();
    optionList.add("-classpath");
    optionList.add(System.getProperty("java.class.path") + ";dist/Deft-Core.jar");

修改

修复了设置类路径的问题。我的jar文件位于我指定的另一个位置。 我用一个

切换了optionList.add调用
optionList.addAll(Arrays.asList("-classpath", System.getProperty("java.class.path") + ";./plugins/Deft-Core.jar"));

所有这一切都修复了我的初始问题,现在它开始导致新的错误。 Apon试图运行我新编译的类文件,它给了我一个错误

java.lang.NoClassDefFoundError: com/deft/core/scripts/DeftScript
    at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_45]
    at java.lang.ClassLoader.defineClass(Unknown Source) ~[?:1.8.0_45]
    at java.security.SecureClassLoader.defineClass(Unknown Source) ~[?:1.8.0_45]
    at java.net.URLClassLoader.defineClass(Unknown Source) ~[?:1.8.0_45]
    at java.net.URLClassLoader.access$100(Unknown Source) ~[?:1.8.0_45]
    at java.net.URLClassLoader$1.run(Unknown Source) ~[?:1.8.0_45]
    at java.net.URLClassLoader$1.run(Unknown Source) ~[?:1.8.0_45]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_45]
    at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_45]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_45]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_45]
    at com.deft.core.main.DeftCore.onEnable(DeftCore.java:79) ~[?:?]

0 个答案:

没有答案