我正在开发一个项目,用户可以在该项目中以原始 Java 代码存储插件。然后,我的应用程序将采用这些插件、编译它们并导入它们。这些类基于存储在我的 jar 中的接口(interface)。但是,当我尝试使用 JavaCompiler.CompilationTask 运行它时,它拒绝让我将当前 jar 添加到编译器的类路径中。在这种情况下,当它尝试对其进行编译时,它的行为就好像该接口(interface)不可用于实现一样。
这是我的文件结构:
主要的 .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”不存在。
最佳答案
正如您所说,
Whenever the application tries to compile this externally stored .java file, it says that the class "plugins.CommandProcessor" does not exist.
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();
}
}
所以你需要在classpath中指定jar。
Java 编译器和运行时不仅可以在单独的文件中搜索类,还可以在 JAR 存档中搜索类。 JAR 文件可以维护自己的目录结构,Java 遵循与在普通目录中搜索完全相同的规则。具体来说,目录名=包名'。因为 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 的反斜杠 ()。
关于java - 在内部编译类时类路径不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584583/
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg