1

所以我已经 OSGI 化了一个战争文件。它仍然适用于 Tomcat。我在清单中有所有必需的字段,并且库现在都嵌入了。稍后我会将它们外部化。有两个没有启用 OSGI。战争文件有 log4j2 嵌入式 BTW。稍后将被删除。

有问题的战争文件是 3 个简单的基于 Jersey 的 REST/JSON 服务。

它启动并进入活动状态,但我无法在我希望找到它的 SoapUI 中找到它。日志显示它正在启动,但这就是它们所显示的全部。

如何从 Karaf 中挤出更多信息,以便正确了解发生了什么?

我必须在 Activator 中做些什么特别的事情才能让它启动吗?

注意:这是一个包装 WURFL 的简单 REST/JSON 服务。根据许可,它是开源的,但尚未发布。

karaf@root()> bundle:headers MobileWURFL

MobileWURFL Maven Webapp (104)
-------------------------------
Manifest-Version = 1.0
Bnd-LastModified = 1395276484402
Archiver-Version = Plexus Archiver
Tool = Bnd-2.1.0.20130426-122213
Embed-Directory = WEB-INF/lib
Embedded-Artifacts = WEB-INF/lib/org.osgi.core-4.3.0.jar;g="org.osgi";a="org.osgi.core";v="4.3.0",WEB-INF/lib/org.osgi.compendium-1.4.0.jar;g="org.apache.felix";a="org.osgi.compend
ium";v="1.4.0",WEB-INF/lib/org.osgi.core-1.4.0.jar;g="org.apache.felix";a="org.osgi.core";v="1.4.0",WEB-INF/lib/javax.servlet-1.0.0.jar;g="org.apache.felix";a="javax.servlet";v="1.
0.0",WEB-INF/lib/org.osgi.foundation-1.2.0.jar;g="org.apache.felix";a="org.osgi.foundation";v="1.2.0",WEB-INF/lib/servlet-api-2.5.jar;g="javax.servlet";a="servlet-api";v="2.5",WEB-
INF/lib/log4j-api-2.0-rc1.jar;g="org.apache.logging.log4j";a="log4j-api";v="2.0-rc1",WEB-INF/lib/log4j-core-2.0-rc1.jar;g="org.apache.logging.log4j";a="log4j-core";v="2.0-rc1",WEB-
INF/lib/disruptor-3.0.1.jar;g="com.lmax";a="disruptor";v="3.0.1",WEB-INF/lib/commons-lang-2.6.jar;g="commons-lang";a="commons-lang";v="2.6",WEB-INF/lib/log4j-slf4j-impl-2.0-rc1.jar
;g="org.apache.logging.log4j";a="log4j-slf4j-impl";v="2.0-rc1",WEB-INF/lib/slf4j-api-1.7.5.jar;g="org.slf4j";a="slf4j-api";v="1.7.5",WEB-INF/lib/commons-collections-3.2.1.jar;g="co
mmons-collections";a="commons-collections";v="3.2.1",WEB-INF/lib/wurfl-1.5.1.jar;g="net.sourceforge.wurfl";a="wurfl";v="1.5.1",WEB-INF/lib/json-20140107.jar;g="org.json";a="json";v
="20140107",WEB-INF/lib/jersey-server-1.8.jar;g="com.sun.jersey";a="jersey-server";v="1.8",WEB-INF/lib/asm-3.1.jar;g="asm";a="asm";v="3.1",WEB-INF/lib/jersey-core-1.8.jar;g="com.su
n.jersey";a="jersey-core";v="1.8"
Built-By = Coder_Guy
Embed-Dependency = *;scope=compile|runtime
Embed-Transitive = true
Webapp-Context = MobileWURFL
Web-ContextPath = MobileWURFL
Build-Jdk = 1.7.0_51
Created-By = Apache Maven Bundle Plugin

Bundle-Name = MobileWURFL Maven Webapp
Bundle-SymbolicName = MobileWURFL
Bundle-Version = 0.0.1.SNAPSHOT
Bundle-ManifestVersion = 2
Bundle-ClassPath = .,WEB-INF/classes,WEB-INF/lib/org.osgi.core-4.3.0.jar,WEB-INF/lib/org.osgi.compendium-1.4.0.jar,WEB-INF/lib/org.osgi.core-1.4.0.jar,WEB-INF/lib/javax.servlet-1.0
.0.jar,WEB-INF/lib/org.osgi.foundation-1.2.0.jar,WEB-INF/lib/servlet-api-2.5.jar,WEB-INF/lib/log4j-api-2.0-rc1.jar,WEB-INF/lib/log4j-core-2.0-rc1.jar,WEB-INF/lib/disruptor-3.0.1.ja
r,WEB-INF/lib/commons-lang-2.6.jar,WEB-INF/lib/log4j-slf4j-impl-2.0-rc1.jar,WEB-INF/lib/slf4j-api-1.7.5.jar,WEB-INF/lib/commons-collections-3.2.1.jar,WEB-INF/lib/wurfl-1.5.1.jar,WE
B-INF/lib/json-20140107.jar,WEB-INF/lib/jersey-server-1.8.jar,WEB-INF/lib/asm-3.1.jar,WEB-INF/lib/jersey-core-1.8.jar
4

1 回答 1

1

当您使用 OSGi 的战争时,Pax Web 的战争扩展器将启动。因此不需要激活器。对于调试,只需使用 karaf debug 启动 karaf 容器,将调试器附加到端口 8787。根据您的嵌入式 jar 可能存在问题,例如 servlet.jar 或类似的会导致部署错误。log4j2.jar 也可能会导致问题。bundle:header 的结果是什么?

用命令

web:list

您还会收到网络包状态的信息。

更新:

它就在您的 Bundle-ClassPath 中。顺便说一句,servlet jar 不允许在 WAR 中。在 OSGi 中,它与 Pax-Web 提供的包发生冲突。在 Tomcat 中,servlet.jar 已经被容器加载,因此它确实可以工作,因为 First-Come-First-Serve 被类加载器使用。对于 OSGi,第一个 Servlet 类位于 War 中,因此解析器不使用 Pax Web 提供的类。删除那个罐子是很重要的。
而且我认为添加那些 osgi jar 也无济于事,这很可能会与容器提供的捆绑包发生冲突。
我强烈建议使用 maven-bundle-plugin 来生成这场战争,以便正确创建导入。或者只是忽略所有 OSGi 元信息并部署标准 WAR。如果您使用以下类型的 URL:

webbundle:mvn:groupID/artifactID/version/war?Web-ContextPath=Mobile-WURFL

它将为您的战争生成适当的 OSGi 清单。

于 2014-03-20T20:12:40.380 回答