我在一个jar文件中有一个主应用程序,它会动态加载'插件,这些是独立的jar文件。
我希望其中一个插件成为REST服务器,所以我使用了泽西。问题是当我加载带有泽西的插件时,我可以运行http服务器,但是当我去../myapp/myresource时,我什么也得不到。浏览器挂起。
如果我将一个main方法放在插件jar中,并直接运行插件,它就可以工作。该页面在浏览器中显示我的静态文本。
以下是main.jar中加载插件的代码。然后我在每个插件上调用Start。
Vector<IPlugin> plugins = new Vector<IPlugin>();
// Get all files in directory "plugins"
File pluginDir = new File("plugins");
File [] pluginFiles = pluginDir.listFiles();
for(File file: pluginFiles)
{
// Load the file
URL url = null;
try
{
url = file.toURI().toURL();
} catch (MalformedURLException e)
{
System.out.println("Failed to get URL of .jar file");
continue;
}
ClassLoader loader = URLClassLoader.newInstance(
new URL[]{url},
Main.class.getClassLoader());
// Load the plug-in interface
try
{
Class cPluginClass = Class.forName("com.company.plugin_test.Plugin", true, loader);
IPlugin plugin = (IPlugin) cPluginClass.newInstance();
// Success, add the plugin to the plugin list
plugins.add(plugin);
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
这是插件代码。
public class Plugin
implements IPlugin
{
private IServer m_server;
public void Start ()
{
System.out.println("Loaded the http_plugin");
String BASE_URI = "http://localhost:8080/myapp/";
final ResourceConfig rc = new ResourceConfig().packages ("com.company.plugin_test");
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
this.start ();
}
public void SetServerInterface(IServer server)
{
this.m_server = server;
}
public void Stop ()
{
}
}
我猜它是一个类加载器问题,但我是java(原生C ++背景)的新手。有任何想法吗?我会继续嘲笑它。
EDIT // ---------------------------- 所以将上面的球衣代码更改为以下作品......
final ResourceConfig rc = new ResourceConfig().register (MyResource.class);
问题是,如何将资源配置设置为当前jar上下文?此外,目前所有内容都具有相同的包名称(com.company.plugin_test)。
答案 0 :(得分:0)
这很有用。我还没有找到一种方法来执行此操作(即扫描包或目录中的所有类)。事实是,我赢得了那么多的网络资源,所以打电话给每个人都很好。
final ResourceConfig rc = new ResourceConfig().register (MyResource.class);