2012-11-12 52 views
0

我試圖在OpenIG上實現我自己的Filter/Handler版本。解決服務器容器上的插件實現的類加載問題

我在eclipse上創建了自己的maven項目,編譯了樣本並將其打包成jar。

我在碼頭8

的openig戰爭在$ JETTY_HOME/webapps中部署運行OpenIG 2.1.0,而我創建的jar在$ JETTY_HOME/lib/ext目錄。

我面臨的異常是NoClassDef找到我的過濾器擴展的GenericFilter類。 GenericFilter存在於openig戰爭中,作爲一個「內聯」罐子

我知道這是一個類加載的問題。插件Jar和OpenIG之間不會共享同一個類加載器。

我的問題是:什麼樣的包裝適合這種情況?

  1. 我就可以重建與我的新階級戰爭 - 似乎不合乎邏輯的,應該有去耦戰爭和插件
  2. 我可以包裝插件作爲戰爭的 - 仍然沒有任何意義。
  3. 使用OSGi - 矯枉過正的方式爲這一點,openIG是不是一個OSGi包

什麼想法?

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 

回答

0

加載時,lib目錄中的類不能使用戰爭中的類。聽起來你想運行OpenIG並在WAR中包含一些自定義部分。如果你使用的是Maven,你可以用Maven WAR Plugin and Overlays來做到這一點。疊加層允許您將代碼添加到現有的WAR以創建新的戰爭。