【问题标题】:Deploying a Jersey webapp on Jboss AS 7在 Jboss AS 7 上部署 Jersey webapp
【发布时间】:2024-01-22 10:42:01
【问题描述】:

目前在 Jboss AS 4/5 上运行一些 webapp,我正在测试迁移到 jboss7。当我尝试在 JBoss AS 7 上部署基于球衣的 webapp(带有独立预览配置文件的完整配置文件)时,我得到:

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

我对它进行了一些搜索,发现 RestEasy 是嵌入到 Application Server 中的默认 JAX-RS 实现。像 http://community.jboss.org/message/579996https://issues.jboss.org/browse/JBAS-8830) 这样的帖子提到 RestEasy 部署程序接管了。

在 AS 6 中,删除部署器似乎更容易,而我还没有看到任何适用于 AS 7 的解决方案。

【问题讨论】:

    标签: jboss migration jersey jboss7.x


    【解决方案1】:

    另一个选项:

    1. 编辑standalone/configuration/standalone.xml 并删除所有jaxrs 条目。这将配置 Jersey 而不是 RESTEasy。
    2. 从 WEB-INF/web.xml 中删除 jboss-web.xml。此文件不再适用于 JBoss 7
    3. 编辑 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

    【讨论】:

      【解决方案2】:
      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.
      

      【讨论】:

        【解决方案3】:
         <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 配合得很好,只是最后错过了一个小斜线来终止该部分。:-)

        【讨论】:

          【解决方案4】:

          您应该排除 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()
          

          请注意,排除子系统功能和部署结构:1.2 是在 7.1.2 中添加的,因此不适用于 7.1.1。

          【讨论】:

            【解决方案5】:

            这对我来说适用于 JBoss 7.1.1 和 Jersey 1.17.1。无需修改standalone.xmldomain.xml。除了过滤 web.xml 中的 restEasy 之外,还指示 Jersey 使用 Jackson。您可以阅读有关此配置的信息here

            为了节省配置猜测的时间,我发布了来自测试项目的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>
            

            【讨论】:

              【解决方案6】:

              我们能否更新“与服务器无关”的方法以包括 JBoss 7.1.1 和 Servlet 3.0?

              &lt;context-param&gt; 在 3.0 版 web-xml 中无效。

              【讨论】:

                【解决方案7】:

                我相信正确的方法是使用与应用服务器无关的 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 上不能正常工作。我已经在 J​​Boss 7.0.2.Final 和 JBoss 7.1.1.Final 中成功测试了这种方法。

                【讨论】:

                • 我面临同样的异常,但我的库位于 EAR/lib 中。如何关闭 EAR/lib 的 resteasy 扫描器?
                【解决方案8】:

                在这篇文章中已经提到过: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>
                

                对我来说很好用

                【讨论】:

                • 也为我工作!有点遗憾的是 web.xml 现在包含一些特定的 JBoss 配置。我更喜欢通过修改 jboss-deployment-structure.xml 来让它工作,但这并没有成功。
                • 这听起来像是 jboss 的一个错误。我也不想修改我的 web.xml 但似乎没有其他选择
                • 是的,它可以工作,但也许您在可部署的战争中包含了额外的和不需要的工件。在 jersey-client 和 jersey-container-servlet 依赖项中添加 compile 后,错误已得到纠正,并且在生成的战争中没有额外的 kbytes。
                • @gersonZaragocin 是的,但这仅在您不使用 Jersey 特定功能的情况下才有效,因为如果您这样做,您最终会使用 JBoss 附带的 RESTEasy。
                【解决方案9】:

                除了删除standalone.xml 中的整个 jaxrs 子系统(如其他帖子中提到的那样,jboss-deployment-structure.xml 中的 RESTEasy 模块除外)也可能有效。

                <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>
                

                也可以看看

                【讨论】:

                  【解决方案10】:

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

                  我为 JBOSS 所做的只是删除 Standalone.xml 中与 jax-rs 相关的所有内容

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

                  我为球衣做的唯一一件事就是从 web.xml 中删除 init-param 并将球衣库复制到 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>-->
                  

                  【讨论】:

                    【解决方案11】:

                    您可以通过修改 configuration/standalone.xml 并删除扩展和配置文件部分中对 jaxrs 的引用,在独立配置中克服这一点。请注意,即使我在standalone.xml 中注释掉了这些部分,JBoss 也会在下次启动时自动删除这些引用...

                    【讨论】:

                    • 如果您的意思是您的编辑没有保留,您需要在进行 XML 编辑之前关闭服务器。对运行时所做的任何更改都将在重新启动时被覆盖。离线或通过管理控制台或 CLI 进行的更改将保持不变。这样,您可以根据需要创建和加载自定义服务器配置文件。