【问题标题】:JBoss - How can to exclude javax.validation in jboss-deployment-structure?JBoss - 如何在 jboss-deployment-structure 中排除 javax.validation?
【发布时间】: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?请帮帮我

【问题讨论】:

    标签: java deployment jboss


    【解决方案1】:

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

    所以隐式模块是自动依赖,它们可以排除,关于这个:class lading and 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 文件中更改默认配置,在&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 验证排除正在工作:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2013-02-06
      • 2017-05-08
      • 2020-12-01
      • 2015-02-17
      • 2013-09-29
      • 2019-09-01
      相关资源
      最近更新 更多