使用基于OSGi的开源平台开发APP,用Karaf做容器,使用一个第三方库时报错。

computerma 2015-12-11 10:53:54
基本情况介绍:开发使用的平台是基于OSGi的,运行在Karaf里。现在要使用一个第三方的bundle(JAR包),

Karaf加载这个JAR包时是没问题的:
2015-12-11 16:45:37,825 | INFO | raf-3.0.4/deploy | fileinstall | 7 - org.apache.felix.fileinstall - 3.5.0 | Installing bundle org.pacesys.openstack4j / 2.0.92015-12-11 16:49:56,917 | INFO | tp1179238011-423 | OpenStackConnector | 178 - org.onosproject.onos-app-xuanwulake - 1.3.0.SNAPSHOT | launchVM, name = dynFW, type = vFW
2015-12-11 16:49:57,195 | ERROR | tp1179238011-423 | ContainerResponse | 131 - com.sun.jersey.jersey-server - 1.19.0 | The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NoClassDefFoundError: javax/xml/parsers/DocumentBuilderFactory
at org.glassfish.jersey.message.internal.MessagingBinders$MessageBodyProviders.configure(MessagingBinders.java:140)
at org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:171)
at org.glassfish.hk2.utilities.binding.AbstractBinder.install(AbstractBinder.java:315)
at org.glassfish.jersey.client.ClientBinder.configure(ClientBinder.java:116)
at org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:171)
at org.glassfish.jersey.internal.inject.Injections.bind(Injections.java:157)
at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:147)
at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:137)
at org.glassfish.jersey.client.ClientConfig$State.initRuntime(ClientConfig.java:385)
at org.glassfish.jersey.client.ClientConfig$State.access$000(ClientConfig.java:87)
at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:119)
at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:116)
at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:322)
at org.glassfish.jersey.client.ClientConfig.getRuntime(ClientConfig.java:722)
at org.glassfish.jersey.client.ClientRequest.getConfiguration(ClientRequest.java:281)
at org.glassfish.jersey.client.JerseyInvocation.validateHttpMethodAndEntity(JerseyInvocation.java:125)
at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:98)
at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:91)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:413)
at org.openstack4j.connectors.jersey2.HttpCommand.execute(HttpCommand.java:79)
at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invokeRequest(HttpExecutorServiceImpl.java:65)
at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.invoke(HttpExecutorServiceImpl.java:56)
at org.openstack4j.connectors.jersey2.HttpExecutorServiceImpl.execute(HttpExecutorServiceImpl.java:33)
at org.openstack4j.core.transport.internal.HttpExecutor.execute(HttpExecutor.java:51)
at org.openstack4j.openstack.internal.OSAuthenticator.authenticateV2(OSAuthenticator.java:117)
at org.openstack4j.openstack.internal.OSAuthenticator.invoke(OSAuthenticator.java:50)
at org.openstack4j.openstack.client.OSClientBuilder$ClientV2.authenticate(OSClientBuilder.java:117)
at org.openstack4j.openstack.client.OSClientBuilder$ClientV2.authenticate(OSClientBuilder.java:81)
at org.onosproject.xuanwulake.service.OpenStackConnector.launchVM(OpenStackConnector.java:54)
at org.onosproject.xuanwulake.service.WebService.addVNF(WebService.java:155)
at org.onosproject.xuanwulake.service.VNFWebResource.addVNF(VNFWebResource.java:154)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_66]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_66]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_66]
at java.lang.reflect.Method.invoke(Method.java:497)[:1.8.0_66]
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)[131:com.sun.jersey.jersey-server:1.19.0]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)[131:com.sun.jersey.jersey-server:1.19.0]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)[131:com.sun.jersey.jersey-server:1.19.0]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)[131:com.sun.jersey.jersey-server:1.19.0]
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)[132:com.sun.jersey.servlet:1.19.0]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)[132:com.sun.jersey.servlet:1.19.0]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733)[132:com.sun.jersey.servlet:1.19.0]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)[99:org.apache.geronimo.specs.geronimo-servlet_3.0_spec:1.0.0]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[104:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)[104:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229)[104:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)[104:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)[104:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)[104:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]


2015-12-11 16:45:44,931 | INFO | raf-3.0.4/deploy | fileinstall | 7 - org.apache.felix.fileinstall - 3.5.0 | Started bundle: file:/home/sdn/Applications/apache-karaf-3.0.4/deploy/org.pacesys.openstack4j_2.0.9.jar


...全文
358 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
computerma 2016-05-10
  • 打赏
  • 举报
回复
问题最终解决了。不过是2015年12月的事情了,java.lang.NoClassDefFoundError: com/google/common/base/MoreObjects 项目使用MoreObjects是用它来记录log的,使用的地方也不是很多。印象中应该是直接用Java自身的System.out.println来规避这个问题的。
tianfang 2015-12-18
  • 打赏
  • 举报
回复
com/google/common/base/MoreObjects这个类是两个月前加入的 上面贴子中的17.0版本是没有的 18.0之后才有,最好是12月发布的19.0版
tianfang 2015-12-18
  • 打赏
  • 举报
回复
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>17.0</version> </dependency> 是一个bundle, com.google .common.base包含在其中 。看看ShellUtil 是否导入了这个bundle
dracularking 2015-12-16
  • 打赏
  • 举报
回复
加这个org.osgi.framework.bootdelegation估计也不能自动找到 如果是类似的,不是和之前一样解决么
computerma 2015-12-15
  • 打赏
  • 举报
回复
你好。这个问题也折腾了很久。基本解决了,只剩下这一个,跟之前发帖的比较类似: 2015-12-15 22:27:52,312 | ERROR | l for user karaf | ShellUtil | 25 - org.apache.karaf.shell.console - 3.0.4 | Exception caught while executing command java.lang.NoClassDefFoundError: com/google/common/base/MoreObjects at org.onosproject.xuanwulake.service.Policy.toString(Policy.java:133) at org.onosproject.xuanwulake.cli.CShowPolicyCmd.execute(CShowPolicyCmd.java:26) at org.onosproject.cli.AbstractShellCommand.doExecute(AbstractShellCommand.java:129) at org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33) at org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33) at Proxy588c04cf_a846_4d01_8593_96980eefb543.execute(Unknown Source) at Proxy588c04cf_a846_4d01_8593_96980eefb543.execute(Unknown Source) at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78) at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480) at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406) at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108) at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182) at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119) at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94) at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:208) at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109) at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_66] at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[26:org.apache.karaf.jaas.modules:3.0.4] at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[25:org.apache.karaf.shell.console:3.0.4] Caused by: java.lang.ClassNotFoundException: com.google.common.base.MoreObjects not found by org.onosproject.onos-app-xuanwulake [176] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532) at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75) at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_66] ... 19 more 我试着通过修改Karaf的config.properties中的org.osgi.framework.bootdelegation来解决这个问题,但试了很多遍都不行。
tianfang 2015-12-12
  • 打赏
  • 举报
回复
你这个问题很偏啊 ,玩osgi的不多 不是bundle加载出的问题。出问题的是找不到: javax/xml/parsers/DocumentBuilderFactory 这个是javax的类,包含rt.jar,你应该采用系统扩展库的方式加载的方式加载 felix是把配置文件中的 #org.osgi.framework.bootdelegation=sun.*,com.sun.* 注释去掉,增加需要引入的包名称 看了一下karaf的配置,在这个下面

org.osgi.framework.bootdelegation = \
    com.sun.*, \
    javax.transaction, \
    javax.transaction.*, \
    javax.xml.crypto, \
    javax.xml.crypto.*, \
没有加载 javax.xml.parsers 而是使用了外部的 javax.xml.parsers

org.osgi.framework.system.packages.extra = \

javax.xml.parsers;uses:=\"javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers\";version=1.4, \
你可以在org.osgi.framework.bootdelegation = \ 下增加 javax.xml.parsers。看看和外部 javax.xml.parsers是否冲突

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧