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?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 Jboss Tools Eclipse 插件在 Jboss 中“热”部署战争依赖项?

如何根据某些条件使 Jboss 崩溃

如何在 Eclipse 中添加 JBoss 服务器?

如何在 jboss 7.1.1 中使用 liferay 6.1.2 中的 jboss 部署 structure.xml?

如何在 JBoss 中设置环境变量