在Jboss AS 7上部署Jersey webapp

目前在Jboss AS 4/5上运行一些webapps,我正在testing迁移到jboss7。 当我尝试在JBoss AS 7上部署一个基于jersey的web应用程序(完整configuration文件和独立预览configuration文件)时,我得到:

org.jboss.as.server.deployment.DeploymentUnitProcessingException: Only one JAX-RS Application Class allowed. 

我已经做了一些狩猎,发现RestEasy是embedded到Application Server中的默认JAX-RS实现。 像http://community.jboss.org/message/579996和https://issues.jboss.org/browse/JBAS-8830 )提到,RestEasy部署者接pipe。

在AS 6中,移除部署者似乎更容易,而我没有看到AS 7的任何解决scheme。

在这篇文章中已经提到过: https ://community.jboss.org/message/744530#744530,你可以让resteasy模块不要在你的webapp中扫描其他的JAX RS实现; 只需将其添加到您的web.xml中:

 <context-param> <param-name>resteasy.scan</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.providers</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.resources</param-name> <param-value>false</param-value> </context-param> 

为我工作得很好

除了除了jboss-deployment-structure.xml的RESTEasy模块之外的其他post中提到的,删除standalone.xml的整个jaxrs子系统也可能工作。

 <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <exclusions> <module name="org.jboss.resteasy.resteasy-atom-provider" /> <module name="org.jboss.resteasy.resteasy-cdi" /> <module name="org.jboss.resteasy.resteasy-jaxrs" /> <module name="org.jboss.resteasy.resteasy-jaxb-provider" /> <module name="org.jboss.resteasy.resteasy-jackson-provider" /> <module name="org.jboss.resteasy.resteasy-jsapi" /> <module name="org.jboss.resteasy.resteasy-multipart-provider" /> <module name="org.jboss.resteasy.async-http-servlet-30" /> </exclusions> </deployment> </jboss-deployment-structure> 

也检查出来

  • JBoss部署结构文件
  • 隐式模块依赖于部署

我相信正确的方法是使用应用程序服务器不可知的JAX-RS应用程序部署。 不需要任何JBossconfiguration。 您只需要在JAX-RS Web应用程序中扩展javax.ws.rs.core.Application 。 你可以在这里find一个例子。 然后,你需要把它放在你的web.xml中。

 <servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>jersey.MyApplication</param-value> </init-param> <context-param> <param-name>resteasy.scan</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.providers</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.resources</param-name> <param-value>false</param-value> </context-param> <load-on-startup>1</load-on-startup> </servlet> 

程序包扫描机制在JBoss 7.x上无法正常工作。 我已经在JBoss 7.0.2.Final和JBoss 7.1.1.Final中成功地testing了这个方法。

  <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> <deployment> <exclude-subsystems> <subsystem name="jaxrs" /> </exclude-subsystems> </deployment> </jboss-deployment-structure> 

将做的伎俩,与7.3AS.ctomc工作很好,只是错过了一个小斜线,以终止部分。:-)

我设法在我的JBOSS AS7上运行Jersey WS。

我为JBOSS所做的只是删除standalone.xml中与jax-rs有关的所有东西

我的jersey示例代码来自: http : //www.ibm.com/developerworks/web/library/wa-aj-tomcat/

我为泽西岛做的唯一的事情就是从web.xml中删除init-param,并将jersey lib复制到WebContent / WEB-INF / lib。

  <!--<init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>sample.hello.resources</param-value> </init-param>--> 
 In web.xml file add the files <context-param> <param-name>resteasy.scan</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.providers</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.resources</param-name> <param-value>false</param-value> </context-param> and comment out the init-param <!-- <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value></param-value> </init-param> --> This worked out for me in jboss-as-7.1.1.Final and i did not do any changes in standalone.xml. 

Ahother选项:

  1. 编辑standalone / configuration / standalone.xml并注释掉所有的jaxrs条目。 这将configuration泽西而不是RESTEasy。
  2. 从WEB-INF / web.xml中删除jboss-web.xml。 这个文件没有与JBoss 7一起工作
  3. 编辑web.xml,添加一个configuration到你的资源包的init-param com.sun.jersey.config.property.packages,比如:

     <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>org.foo</param-value> </init-param> 

https://github.com/Atmosphere/atmosphere/wiki/Deploying-Atmosphere-Jersey-in-JBoss-7.1.x

您可以通过修改configuration / standalone.xml并在扩展和configuration文件部分中删除对jaxrs的引用,从而在独立configuration中获得此信息。 请注意,即使我在standalone.xml中注释了这些部分,JBoss会自动在下次启动时删除这些引用。

我们能否更新“服务器不可知”的方法来包含JBoss 7.1.1和Servlet 3.0?

3.0版web-xml中<context-param>无效。

这里是我为JBoss 7.1.1和泽西岛1.17.1工作。 无需修改standalone.xmldomain.xml 。 除了在web.xml中过滤restEasy指示Jersey使用Jackson。 你可以在这里阅读这个configuration。

为了节省configuration猜测的时间,我从testing项目发布web.xmlpom.xml

web.xml中

 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>TestJerseyonJBoss</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.test.rest</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> <context-param> <param-name>resteasy.scan</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.providers</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.resources</param-name> <param-value>false</param-value> </context-param> </web-app> 

的pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>TestJerseyOnJBoss</groupId> <artifactId>TestJerseyOnJBoss</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-bundle</artifactId> <version>1.17.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.17.1</version> </dependency> <dependency> <groupId>asm</groupId> <artifactId>asm</artifactId> <version>3.3.1</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies> 

您应该为您的部署排除激活的jaxrs子系统,将其添加到META-INF / jboss-deployment-structure.xml中

 <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> <deployment> <exclude-subsystems> <subsystem name="jaxrs" /> </exclude-subsystems> <deployment> </jboss-deployment-structure> 

或者你可以去standalone.xml并在那里删除子系统。 要做到这一点,你需要删除

 <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"> ... ... <subsystem> 

部分configuration,顶部的扩展部分可以保持它不会伤害任何一种方式。 或者可以使用CLI连接到服务器并运行

 /subsystem=webservices:remove() 

请注意,排除子系统function和部署结构:7.1.2被添加到7.1.2中,因此在7.1.1上不起作用。