【问题标题】:Debugging and troubleshooting Apache Karaf 3Apache Karaf 3 的调试和故障排除
【发布时间】:2014-04-27 12:53:40
【问题描述】:

所以我已经 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

【问题讨论】:

    标签: json rest jersey osgi karaf


    【解决方案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 清单。

    【讨论】:

    • 当我使用 http:list 时,它没有列出,但 Web 控制台是。 :-/ 在 Web 控制台中,我可以启动它,然后它会进入活动状态,然后我可以停止它。我会给你 bundle:headers 但它很长。没有出口或进口。
    • 我将 bundle:headers 的输出添加到问题中。
    • http:list 命令用于 OSGi HttpServices 并且不列出任何 Web 上下文,它是 web:list 命令将显示您的包的状态。它很可能会显示未部署。
    • karaf@root()> web:list ID |状态 |网络状态 |水平 | Web-ContextPath |姓名 - - - - - - - - - - - - - - - - - - - - - - - - - -------------------------------------------------- --- 104 |活跃 |未知 | 80 | /MobileWURFL | MobileWURFL Maven Webapp (0.0.1.SNAPSHOT) karaf@root()>
    • 看起来它在端口 80 上,但我仍然无法访问服务。
    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2016-06-06
    • 2013-07-15
    • 2010-11-30
    • 2021-09-11
    • 2012-02-18
    • 2011-03-07
    相关资源
    最近更新 更多