内部编译类时,Classpath无法正常工作?

内森(Nathan F.)

我正在一个项目中,用户可以在其中存储原始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”类不存在。

所以实际的问题是

  1. 您的jar文件结构和Java文件位置不匹配,因为您在外部存储了.java文件。在您的代码中,当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。

类路径上的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使用反斜杠()。

资源位置:

  1. Java忽略类路径
  2. 类路径和多个类搜索目录上的JAR

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

此代码无法正常工作,编译时显示错误?

来自分类Dev

为什么在代码编译正常且设置了classpath时找不到base64类

来自分类Dev

筛选器无法正常工作-内部联接表时

来自分类Dev

Python for loop在按钮命令内部时无法正常工作

来自分类Dev

添加/删除类时Animate.css无法正常工作

来自分类Dev

更改类时,nth-child(odd)无法正常工作

来自分类Dev

JScrollPane 内部的内部 JScrollPane 无法正常工作

来自分类Dev

php类无法正常工作

来自分类Dev

CSS类无法正常工作

来自分类Dev

CSS类无法正常工作

来自分类Dev

Python类无法正常工作?

来自分类Dev

CSS类无法正常工作

来自分类Dev

CSS类无法正常工作

来自分类Dev

QuickLook类无法正常工作

来自分类Dev

css 类无法正常工作

来自分类Dev

jQuery在预编译后无法正常工作

来自分类Dev

用于动态编译的Javac无法正常工作

来自分类Dev

预编译文件无法正常工作

来自分类Dev

C编译器无法正常工作

来自分类Dev

Typescript 编译器无法正常工作?

来自分类Dev

:echo内部:inorea无法正常工作

来自分类Dev

如果setter是内部的,则getter无法正常工作

来自分类Dev

WordPress内部的phpseclib无法正常工作

来自分类Dev

Ajax在Featherlight内部无法正常工作

来自分类Dev

函数内部的事件无法正常工作

来自分类Dev

Python - For 内部 for 循环无法正常工作

来自分类Dev

在Bean内部调用该方法时,Spring AOP无法正常工作

来自分类Dev

当我使用 javascript 使用内部地图时,Promise 无法正常工作

来自分类Dev

类路径问题:Gradle无法正常工作