【问题标题】:Exclude hibernate-validator module in Wildfly 8.2.1在 Wildfly 8.2.1 中排除 hibernate-validator 模块
【发布时间】:2018-04-18 13:46:34
【问题描述】:

我正在尝试在 Wildfly 8.2.1 上从 https://github.com/dewthefifth/java-examples/tree/master/multi-ear-jms 部署 packager-01 EAR,并收到以下错误,因为 Wildfly 坚持要从 $JBOSS_HOME/modules/org/ 加载 hibernate-validator 模块hibernate/validator/main 而不是位于我 EAR 内部的那个。

Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor': Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.hibernate.validator.engine.ConfigurationImpl.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:223)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:87)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:72)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    ... 3 more

注意:这是部署在同一应用服务器上的不同应用程序所需的自定义部署模块。在部署包含多个自定义休眠模块的其他应用程序之前,我能够让 EAR 进行部署。

我尝试使用以下 jboss-deployment-structure 排除验证器模块(基本上添加了任何 google 结果甚至暗示的所有排除),但没有运气。无论我做什么,加载的验证器都是Hibernate Validator 4.2.0.Final,而我在EAR 中提供的验证器是hibernate-validator-6.0.7.Final.jar

<jboss-deployment-structure>
<!-- Make sub deployments isolated by default, so they cannot see each others classes without a Class-Path entry -->
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<!-- This corresponds to the top level deployment. For a war this is the war's module, for an ear -->
<!-- This is the top level ear module, which contains all the classes in the EAR's lib folder -->
<deployment>
    <exclude-subsystems>
        <subsystem name="jaxrs" />
        <subsystem name="resteasy" />
    </exclude-subsystems>
    <exclusions>
        <!-- Exclude Jackson - I included my own -->
        <module name="com.fasterxml.jackson.core.jackson-annotations" />
        <module name="com.fasterxml.jackson.core.jackson-core" />
        <module name="com.fasterxml.jackson.core.jackson-databind" />
        <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
        <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        <module name="org.jboss.resteasy.resteasy-jackson2-provider" />

        <module name="org.apache.xalan" />
        <module name="org.apache.xerces" />
        <module name="org.jboss.logging" />

        <!-- Exclude Hibernate -->
        <module name="org.hibernate" />

        <!-- Exclude hibernate validation -->
        <module name="org.jboss.resteasy.resteasy-validator-provider-11" />
        <module name="org.hibernate.validator" />
        <module name="javax.validation.api" />
        <module name="javaee.api" />
        <module name="javax.faces.api" />
    </exclusions>
    <!-- This allows you to define additional dependencies, it is the same as using the Dependencies: manifest attribute -->
    <dependencies>

    </dependencies>
</deployment>

如果有人知道我需要排除哪个子系统,我将不胜感激。

注意:我正在共享我的 Wildfly 8.2.1,甚至使用我的 Wildfly 8.2.1,因为这些是我的客户部署站点对我施加的限制。


更新 1: 感谢您迄今为止的帮助。

我的新排除列表包含以下内容 错误的

        <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        <module name="org.jboss.resteasy.resteasy-jackson2-provider" />

        <module name="org.apache.xalan" />
        <module name="org.apache.xerces" />
        <module name="org.jboss.logging" />

        <!-- Exclude Hibernate -->
        <module name="org.hibernate" />
        <module name="javax.persistence.api" />

        <!-- Exclude hibernate validation -->
        <module name="org.hibernate.validator" />


        <module name="org.jboss.invocation" />
        <module name="org.jboss.as.connector" />
        <module name="org.jboss.as.ee" />
        <module name="org.jboss.as.jpa" />
        <module name="org.jboss.as.jpa.hibernate" />
        <module name="javax.resource.api" />
        <module name="org.jboss.as.ejb-client" />
        <module name="org.jboss.as.weld" />
        <module name="org.jboss.ironjacamar.impl" />
        <module name="org.jboss.ironjacamar.jdbcadapters" />
        <module name="org.jboss.resteasy.resteasy-jaxrs" />
        <module name="org.jboss.resteasy.resteasy-validator-provider-11" />

        <module name="javaee.api" />
        <module name="javax.el.api" />
        <module name="javax.enterprise.api" />
        <module name="javax.faces.api" />
        <module name="javax.persistence.api" />
        <module name="javax.servlet.jsp.api" />
        <module name="javax.validation.api" />

    </exclusions>
    <!-- This allows you to define additional dependencies, it is the same as using the Dependencies: manifest attribute -->
    <dependencies>

    </dependencies>
</deployment>

我通过为所有 JBOSS 开启 TRACE 级别登录并基本上添加排除项来确定第一个列出的条目,直到我停止看到 Hibernate 4.0.2 正在加载。我还不能准确地找出其中哪些是真正的罪魁祸首,但我们正在取得进展。

我将补充一点,现在 WAR 不再部署,因为它缺少核心 jee 库...(如您所料)。我会在有时间的时候更新,希望最终能产生它工作所需的真正(最小)排除集。

【问题讨论】:

    标签: spring-boot wildfly wildfly-8


    【解决方案1】:

    我认为您还需要将其从所有依赖项中排除。我正在开发 6.4EAP,因此它可能会针对您的 jboss 版本略有变化,但请尝试一下。因此,如果您使用的是 linux,请转到您的模块 jboss 子目录并 grep 查找 org.hibernate.validator (grep -ir "org.hibernate.validator" .)。

    这将显示如下结果:

    ./system/layers/base/org/hibernate/validator/main/module.xml:<module xmlns="urn:jboss:module:1.1" name="org.hibernate.validator">
    ./system/layers/base/org/jboss/as/jpa/hibernate/3/module.xml:        <module name="org.hibernate.validator"/>
    ./system/layers/base/org/jboss/as/jpa/hibernate/4/module.xml:        <module name="org.hibernate.validator"/>
    ./system/layers/base/org/jboss/as/jpa/main/module.xml:        <module name="org.hibernate.validator"/>
    ./system/layers/base/org/jboss/as/ee/main/module.xml:        <module name="org.hibernate.validator" optional="true"/>
    ./system/layers/base/org/jboss/as/connector/main/module.xml:        <module name="org.hibernate.validator"/>
    ./system/layers/base/org/jboss/resteasy/resteasy-hibernatevalidator-provider/main/module.xml:        <module name="org.hibernate.validator"/>
    ./system/layers/base/org/jboss/ironjacamar/impl/main/module.xml:        <module name="org.hibernate.validator"/>
    ./system/layers/base/org/jboss/ironjacamar/jdbcadapters/main/module.xml:        <module name="org.hibernate.validator"/>
    

    然后您可以知道您需要哪些模块以及需要从哪些模块中排除它。在这里我发布我的配置...也许它会帮助你

    <deployment>
        <exclusions>
            <module name="org.apache.log4j"/>
            <module name="org.apache.commons.logging"/>
            <module name="org.slf4j"/>
            <module name="org.jboss.logging"/>
            <module name="org.hibernate"/>
            <module name="org.hibernate.validator"/>
    
            <module name="javaee.api"/>
            <module name="javax.el.api"/>
            <module name="javax.enterprise.api"/>
            <module name="javax.faces.api"/>
            <module name="javax.persistence.api"/>
            <module name="javax.servlet.jsp.api"/>
            <module name="javax.validation.api"/>
        </exclusions>
        <dependencies>
            <module name="javax.annotation.api" export="true"/>
            <module name="javax.ejb.api" export="true"/>
            <module name="javax.interceptor.api" export="true"/>
            <module name="org.jboss.modules" export="true"/>
            <module name="javax.servlet.jsp.api" export="true">
                <imports>
                    <include path="/**"/>
                    <exclude-set>
                        <path name="javax/el"/>
                    </exclude-set>
                </imports>
            </module>
            <module name="javax.enterprise.api" export="true">
                <imports>
                    <include path="/**"/>
                    <exclude-set>
                        <path name="javax/el"/>
                    </exclude-set>
                </imports>
            </module>
        </dependencies>
    </deployment>
    
    <sub-deployment name="admin.war">
        <exclusions>
            <module name="javaee.api"/>
            <module name="javax.el.api"/>
            <module name="javax.enterprise.api"/>
            <module name="javax.faces.api"/>
            <module name="javax.persistence.api"/>
            <module name="javax.servlet.jsp.api"/>
            <module name="javax.validation.api"/>
            <module name="org.apache.commons.logging"/>
            <module name="org.apache.log4j"/>
            <module name="org.jboss.logging"/>
            <module name="org.hibernate"/>
            <module name="org.hibernate.validator"/>
            <module name="org.slf4j"/>
        </exclusions>
        <local-last value="true"/>
    </sub-deployment>
    

    当我删除 javax/el 时,我工作了

    【讨论】:

      【解决方案2】:

      我最终在 https://github.com/dewthefifth/spring-boot-ear-skinny-war/tree/spring-boot-2.0-with-spring-legacy-with-wfcore-209-workaround 上提供的另一个项目/模块上取得了一些成功。

      具体来说,web0 项目很幸运地删除了验证器,但是任何从 EAR 中删除它的尝试都失败了。

      github 链接专注于进行删除,以便 Spring 5+ 可以在 JBOSS 和 Wildfly 上使用。它包含一个 README,其中包含有关测试了 Wildfly 和 JBOSS 的确切版本的详细信息,以及针对不起作用的 JBOSS 版本的解决方法(它不漂亮)。

      【讨论】:

        猜你喜欢
        • 2020-09-27
        • 2018-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多