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 文件中更改默认配置,在
<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 文件夹 new javax.validation .jar 和 model.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 7.1.1 中使用 liferay 6.1.2 中的 jboss 部署 structure.xml?