現在、Jboss AS 4/5でいくつかのwebアプリを実行しており、jboss7への移行をテストしています。 jerseyベースのwebappをJBoss AS 7(standalone-preview設定ファイルを含む完全なプロファイル)にデプロイしようとすると、次のようになります:
org.jboss.as.server.deployment.DeploymentUnitProcessingException: Only one JAX-RS Application Class allowed.
少し調べてみたところ、RestEasyがApplication Serverに組み込まれているデフォルトのJAX-RS実装であることがわかりました。 http://community.jboss.org/message/579996 および https://issues.jboss.org/browse/JBAS-88 )のような投稿はRestEasyに言及しているデプロイヤが引き継ぎます。
AS 6では、デプロイヤを削除する方が簡単であるように見えますが、AS 7のソリューションは見ていません。
この投稿ですでに言及されています: https://community.jboss.org/message/744530#7445 、webappの他のJAX RS実装をスキャンしないようresteasyモジュールに依頼することができます;これを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>
私のためにうまくいった
standalone.xml
内のRESTEasyモジュールを除く他の投稿で説明されているように、jboss-deployment-structure.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>
またチェックアウト
正しいアプローチは、アプリケーションサーバーに依存しないJAX-RSアプリケーションの展開を使用することだと思います。 JBoss設定を台無しにする必要はありません。必要なのは、JAX-RS Webアプリケーションで javax.ws.rs.core.Application を拡張することだけです。例があります here 。次に、これを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でこのアプローチを正常にテストしました。
<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でうまく動作します。セクションを終了するために最後に小さなスラッシュを忘れました。:-)
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.
JBOSS AS7でJersey WSを実行できました。
JBOSSで行うことは、standalone.xmlでjax-rsに関連するものをすべて削除することです
私のジャージのサンプルコードは、 http://www.ibm.com/developerworks/web/library/wa-aj-Tomcat/ から取得しました。
Jerseyで行う唯一のことは、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>-->
他のオプション:
Web.xmlを編集し、次のようにリソースのパッケージに構成された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
JBoss 7.1.1とJersey 1.17.1で私にとってうまくいったのは次のとおりです。変更する必要はありませんstandalone.xml
またはdomain.xml
。 web.xmlでrestEasyをフィルタリングする以外に、JerseyにJacksonを使用するように指示します。この構成について読むことができます こちら 。
構成を推測する時間を節約するために、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>
Configuration/standalone.xmlを変更し、extensionsおよびprofileセクションでjaxrsへの参照を削除することにより、スタンドアロン構成でこれを乗り越えることができます。 standalone.xmlでこれらの部分をコメントアウトしましたが、JBossは次回の起動時にこれらの参照を自動的に完全に削除することに注意してください...
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>
構成の一部、上部の拡張部分は、どちらの方法でも傷つかないようにすることができます。または、CLIでサーバーに接続して実行できます
/subsystem=webservices:remove()
ただし、7.1.2ではexclude-subsystems機能とdeployment-strucure:1.2が追加されたため、7.1.1では機能しません。
「server-agnostic」アプローチを更新して、JBoss 7.1.1とServlet 3.0を含めることはできますか?
<context-param>
は、バージョン3.0 web-xmlでは無効です。