我正在一个项目中,用户可以在其中存储原始Java代码中的插件。然后,我的应用程序将使用这些插件,对其进行编译,然后将其导入。这些类基于存储在我的jar中的接口。但是,当我尝试使用JavaCompiler.CompilationTask运行它时,它拒绝允许我将当前jar添加到编译器的类路径中。在这种情况下,当尝试对其进行编译时,它的作用就好像无法实现该接口一样。
这是我文件的结构:
主.jar文件:
CommandProcessor.java
----------------------------------------------
package plugins;
public interface CommandProcessor {
public String onCommand(String command);
}
然后,我有一个用于加载插件的功能。
http://hastebin.com/jabacopeye.coffee(HasteBin避免使问题过于混乱)
这是用户插件之一的示例:
public class MyCommand implements plugins.CommandProcessor {
@Override
public String onCommand(String command){
return "this is a test";
}
}
每当应用程序尝试编译此外部存储的.java文件时,它都说“ plugins.CommandProcessor”类不存在。
就像你说的那样
每当应用程序尝试编译此外部存储的.java文件时,它都说“ plugins.CommandProcessor”类不存在。
task.call()
调用时,URLClassLoader无法从"./plugins/WebC/plugins/"
位置加载文件。因此,您的代码无法继续执行
if (task.call()) {
URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("./plugins/WebC/plugins/").toURI().toURL()});
Class<?> loadedClass = classLoader.loadClass(className);
Object obj = loadedClass.newInstance();
if (obj instanceof CommandProcessor) {
CommandProcessor cmd = (CommandProcessor)obj;
classLoader.close();
return cmd;
}else{
classLoader.close();
}
}
因此,您需要在类路径上指定jar。
Java编译器和运行时不仅可以在单独的文件中搜索类,还可以在“JAR' archives. A JAR file can maintain its own directory structure, and Java follows exactly the same rules as for searching in ordinary directories. Specifically,
目录名=包名”中搜索类。因为JAR本身是目录,所以要在类搜索路径中包含JAR文件,该路径必须引用JAR本身,而不仅仅是引用包含JAR的目录。这是一个非常常见的错误。假设我在目录/ myclasses中有一个JAR myclasses.jar。要让Java编译器在此jar中查找类,我们需要指定:
javac -classpath /myclasses/myclasses.jar ...
不仅是目录myclasses。
在上面的示例中,我们告诉javac一次只在一个目录中搜索。实际上,您的类搜索路径将包含许多目录和JAR存档。javac和java的-classpath选项允许指定多个条目,但是请注意,对于Unix和Windows系统,语法略有不同。在Unix上,我们可以这样做:
javac -classpath dir1:dir2:dir3 ...
而在Windows上,我们有:
javac -classpath dir1;dir2;dir3 ...
造成这种差异的原因是Windows使用冒号(:)字符作为文件名的一部分,因此不能将其用作文件名分隔符。当然,目录分隔符也有所不同:Unix使用正斜杠(/),Windows使用反斜杠()。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句