JBoss - 如何在 jboss-deployment-structure 中排除 javax.validation?

JBoss - How can to exclude javax.validation in jboss-deployment-structure?

我有 .war 使用 Jersey REST,它在 tomCat 中有效。但是我需要 运行 我的 .war 在 JBoss 6.4.0 中导致异常

java.lang.RuntimeException: java.lang.NoSuchMethodError:
javax.validation.spi.ConfigurationState.getParameterNameProvider()

因为 JBoss 使用旧版本 javax.validation,我需要从 JBoss 的部署中排除 javax.validation。

我在 .war:

的 WEB-INF 中创建 jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>

    <deployment>

        <exclude-subsystems>
            <subsystem name="resteasy" />
            <subsystem name="jpa"/>
            <subsystem name="org.hibernate" />
            <subsystem name="org.hibernate.validator" />
        </exclude-subsystems>

        <exclusions>
            <module name="javaee.api" />
            <module name="javax.ws.rs.api"/>
            <module name="org.jboss.resteasy.resteasy-jaxrs"/>
            <module name="javax.validation.api"/>
            <module name="org.hibernate"/>
            <module name="org.hibernate.validator"/>
        </exclusions>   

    </deployment>
</jboss-deployment-structure>

这帮助我排除了 javax.ws.rs,但是如何排除 javax.validation?请帮助我

所以,这是一个东西!可能对某人有帮助: JBoss 中的库 javax.validation.api - 属于 隐式模块 ,关于隐式模块的文档:implicit module dependencies

所以隐式模块是 Automatic Dependencies,它们可以排除,关于这个:class lading and automatic dependencies - 关于 Automatic Dependencies 的部分: 可以通过使用 jboss-deployment-structure.xml 排除自动依赖项。但这是行不通的! :(,并且 JBoss 与类似的库 javax.persistence 有错误,并且它在任务中打开错误。

那么 - 可以做什么?

  1. 更新 JBoss 到 7.0.0 版本,但现在只有 Alpha 和 Beta 版本:(
  2. 在新版本 .jar 上替换旧 javax.validation.api .jar (在 EAP-6.4.0/modules/system/layers/base/javax/faces/api/main
  3. 添加自定义版本,纠结: 更改 EAP-6.4.0/modules/system/layers/base/javax/faces/api/main module.xml 文件中的默认配置,第 <module name="javax.validation.api" export="true"/> 行删除选项 export="true",结果:<module name="javax.validation.api"/> 这更改为允许您添加新的自定义库 javax.validation。 并在 EAP-6.4.0/modules/system/layers/base/javax/validation/api 中创建名为 1.1 的自定义文件夹,放入 1.1文件夹新建javax.validation.jarmodel.xml.

model.xml:

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="javax.validation.api" slot="1.1">
    <resources>
        <resource-root path="validation-api-1.1.0.Final.jar"/>
    </resources>

  <dependencies>
    <module name="org.jboss.logging"/>
  </dependencies>
</module>

params: slot - name custom folder (1.1), path - path to .jar library

最后:将模块添加到项目中的 jboss-deployment-structure.xml:

<dependencies>
  <module name="javax.validation.api" slot="1.1" export="true"/>
</dependencies>

好的,所以您不仅需要排除

<module name="javax.validation.api"/> 

本身,还有依赖于 javax.validation.api 模块的模块。查看哪些模块依赖于 javax.validation.api 并强制包含它(即使它被排除在外)的最简单方法是在中搜索您的 .xml 文件 JBOSS_DIRECTORY/modules 对于 javax.validation.api,依赖的模块在 module.xml 中有类似的东西:

<dependencies>>
    <module name="javax.validation.api"/>
...

并且还需要排除这些模块。对我来说 - 我还需要排除:

        <module name="javax.faces.api"/>
        <module name="org.jboss.resteasy.resteasy-hibernatevalidator-provider"/>

然后,javax 验证排除工作 :)