在JAR中加载Grizzly / Jersey服务器

时间:2014-10-24 16:34:46

标签: java rest jersey grizzly

我在一个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)。

1 个答案:

答案 0 :(得分:0)

这很有用。我还没有找到一种方法来执行此操作(即扫描包或目录中的所有类)。事实是,我赢得了那么多的网络资源,所以打电话给每个人都很好。

final ResourceConfig rc = new ResourceConfig().register (MyResource.class);