在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选项:
- 编辑standalone / configuration / standalone.xml并注释掉所有的jaxrs条目。 这将configuration泽西而不是RESTEasy。
- 从WEB-INF / web.xml中删除jboss-web.xml。 这个文件没有与JBoss 7一起工作
-
编辑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.xml
或domain.xml
。 除了在web.xml中过滤restEasy指示Jersey使用Jackson。 你可以在这里阅读这个configuration。
为了节省configuration猜测的时间,我从testing项目发布web.xml
和pom.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上不起作用。