JBoss应用遇到问题记录

Q: 无法读取classpath下以及jar包中的资源文件

A: 由JBoss特殊的vfs协议导致。

JBoss部署war包时,会将lib下的jar包都分别生成1个以该jar包名为目录名的临时目录,该目录及其结构举例如下:
\jboss-as-7.1.1.Final\standalone\tmp\vfs\deployment4d324381d816bd6d\xxx.jar-f6e3c6735c9f83f9\contents
\jboss-as-7.1.1.Final\standalone\tmp\vfs\deployment4d324381d816bd6d\xxx.jar-f6e3c6735c9f83f9\contents\xxx.jar

以xxx.properties为例,通过classloader.getResource得到的文件url为
/jboss-as-7.1.1.Final/bin/content/xxx.war/WEB-INF/lib/xxx.jar/xxx.properties
而/bin/content 这个目录实际上是不存在的,通过以下代码可以得到该资源文件的path为:
\jboss-as-7.1.1.Final\standalone\tmp\vfs\deployment99c58cfccb17ed42\xxx.jar-f6e3c6735c9f83f9\contents\xxx.properties

而实际上contents目录又是空的,因此处理时需要解析得到xxx.jar包的物理路径,然后再从该jar包中取得资源文件。

Object content = url.openConnection().getContent();
Class<?> czz = Class.forName("org.jboss.vfs.VirtualFile");
Method m = czz.getMethod("getPhysicalFile");
File physicalFile = (File) m.invoke(content);

注:需要引入JBoss jar包,maven依赖如下:

<dependency>
	<groupId>org.jboss</groupId>
	<artifactId>jboss-vfs</artifactId>
	<version>3.0.1.GA</version> <!-- jdk1.6+ -->
</dependency>

Q: 调用WebService接口时出现以下异常:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/xxx].[WebServiceServlet]] (http--0.0.0.0-8380-2)
Servlet.service() for servlet WebServiceServlet threw exception:
java.lang.NoClassDefFoundError: com/sun/xml/messaging/saaj/soap/SOAPDocumentImpl

A: 删掉部署包中的以下2个jar包:saaj-impl-1.3.9.jar, saaj-api-1.3.3.jar

see: http://cxf.547215.n5.nabble.com/Does-anyone-successfully-deployed-CXF-services-with-WS-Security-Signature-and-Encyrption-in-WebSpher1-td563604.html

 

猜你喜欢

转载自coffeelover.iteye.com/blog/1992188
今日推荐