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

Posted

技术标签:

【中文标题】JBoss - 如何在 jboss-deployment-structure 中排除 javax.validation?【英文标题】:JBoss - How can to exclude javax.validation in jboss-deployment-structure? 【发布时间】:2016-03-21 11:45:58 【问题描述】:

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

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?请帮帮我

【问题讨论】:

【参考方案1】:

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

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

那么 - 可以做什么?

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

参数: 插槽 - 命名自定义文件夹(1.1), path - .jar 库的路径

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

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

【讨论】:

其实是可以的,但是还需要排除依赖于验证模块的模块。【参考方案2】:

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

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

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

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

这些模块也需要排除在外。对我来说 - 我还需要排除:

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

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

【讨论】:

以上是关于JBoss - 如何在 jboss-deployment-structure 中排除 javax.validation?的主要内容,如果未能解决你的问题,请参考以下文章