解决服务器容器上的插件实现的类加载问题

时间:2012-11-12 21:54:54

标签: java-ee plugins jetty classloader

我正在尝试在OpenIG上实现我自己的Filter/Handler版本。

我在eclipse上创建了自己的maven项目,编译了样本并将其打包到jar中。

我在Jetty 8上运行OpenIG 2.1.0。

openig war部署在$ JETTY_HOME / webapps下,而我创建的jar则在$ JETTY_HOME / lib / ext下。

我面临的异常是NoClassDefFound我的过滤器扩展的GenericFilter类。 GenericFilter存在于openig战争中,作为“内联”jar

我知道这是一个类加载的问题。 Plugin Jar和OpenIG war不共享相同的类加载器。

我的问题是:什么形式的包装适合这种情况?

  1. 我可以用我的新班重建战争 - 似乎不合逻辑,应该有战争和插件的脱钩
  2. 我可以将插件包装成战争 - 仍然没有意义。
  3. 使用OSGI - 方式过度杀戮,而openIG不是OSGI包
  4. 任何想法?

    java.lang.NoClassDefFoundError: org/forgerock/openig/filter/GenericFilter
     at java.lang.ClassLoader.defineClass1(Native Method)
     at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
     at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:424)
     at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377)
     at java.lang.Class.forName0(Native Method)
     at java.lang.Class.forName(Class.java:264)
     at org.forgerock.openig.util.JsonValueUtil.classForName(JsonValueUtil.java:80)
     at org.forgerock.openig.util.JsonValueUtil.asClass(JsonValueUtil.java:94)
     at org.forgerock.openig.heap.HeapImpl.init(HeapImpl.java:64)
     at org.forgerock.openig.federation.FederationGatewayServlet.init(FederationGatewayServlet.java:67)
     at javax.servlet.GenericServlet.init(GenericServlet.java:244)
     at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:456)
     at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:347)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:535)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:489)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:483)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:972)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:417)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:906)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
     at org.eclipse.jetty.server.Server.handle(Server.java:350)
     at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:442)
     at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:910)
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:565)
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217)
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:46)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:545)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:43)
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
     at java.lang.Thread.run(Thread.java:722)
    Caused by:
    java.lang.ClassNotFoundException: org.forgerock.openig.filter.GenericFilter
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
     at java.lang.ClassLoader.defineClass1(Native Method)
     at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
     at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:424)
     at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377)
     at java.lang.Class.forName0(Native Method)
     at java.lang.Class.forName(Class.java:264)
     at org.forgerock.openig.util.JsonValueUtil.classForName(JsonValueUtil.java:80)
     at org.forgerock.openig.util.JsonValueUtil.asClass(JsonValueUtil.java:94)
     at org.forgerock.openig.heap.HeapImpl.init(HeapImpl.java:64)
     at org.forgerock.openig.federation.FederationGatewayServlet.init(FederationGatewayServlet.java:67)
     at javax.servlet.GenericServlet.init(GenericServlet.java:244)
     at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:456)
     at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:347)
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:535)
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:489)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:483)
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:972)
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:417)
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:906)
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
     at org.eclipse.jetty.server.Server.handle(Server.java:350)
     at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:442)
     at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:910)
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:565)
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217)
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:46)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:545)
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:43)
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
     at java.lang.Thread.run(Thread.java:722)C
    

1 个答案:

答案 0 :(得分:0)

加载时,lib目录中的类不能使用war中的类。听起来你想要运行OpenIG并在WAR中包含一些自定义部件。如果您使用的是Maven,则可以使用Maven WAR Plugin and Overlays执行此操作。覆盖允许您将代码添加到现有WAR以创建新战争。

相关问题