【问题标题】:NoSuchMethodError exception while deploying an Ear in Jboss 6.2.0 GA with Spring Boot module in it在 Jboss 6.2.0 GA 中部署带有 Spring Boot 模块的 Ear 时出现 NoSuchMethodError 异常
【发布时间】:2019-02-23 20:15:09
【问题描述】:

我花了一整天的时间寻找摆脱这种情况的方法。

序言

我的目标是在 EAR 中部署一个 Spring Boot 应用程序以及其他两个已经工作的模块。由于 Spring Boot 应用程序的 POM 必须链接到父 POM,因此我已经克服了许多问题,因为结构如下:

/父 POM

-----> 耳朵 POM

-----> 模块 1 POM

-----> 模块 2 POM

-----> Spring Boot App POM

问题

Spring Boot 应用程序正确打包为 WAR 并成功放入 Ear。在 JBoss 上加载此 War 时会出现此问题,因为存在一些 dependecy 问题。

我做了什么

我玩了一点jboss-deployment-structure.xml,最终结果是这样的(restService 是 Spring Boot 应用程序) :

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    <deployment>
        <exclusions>
            <!-- WFCORE-209 workaround -->
            <module name="javaee.api" />
            <module name="org.hibernate.validator"/>
            <module name="javax.persistence.api" />
            <module name="org.hibernate" />
            <!--<module name="javax.validation"/>-->
        </exclusions>
        <exclude-subsystems>
            <subsystem name="jaxrs" />
            <subsystem name="datasources" />
            <subsystem name="ejb3" />
            <subsystem name="infinispan" />
            <subsystem name="jca" />
            <subsystem name="logging" />
            <subsystem name="jdr" />
            <subsystem name="jpa" />
            <subsystem name="jsf" />
            <subsystem name="mail" />
            <subsystem name="threads" />
            <subsystem name="pojo" />
            <subsystem name="sar" />
            <subsystem name="transactions" />
            <subsystem name="webservices" />
            <subsystem name="weld" />
        </exclude-subsystems>
        <dependencies>
            <!-- WFCORE-209 workaround -->
            <module name="javax.activation.api" export="true"/>
            <module name="javax.annotation.api" export="true"/>
            <module name="javax.ejb.api" export="true"/>
            <module name="javax.el.api" export="true"/>
            <module name="javax.enterprise.api" export="true"/>
            <module name="javax.enterprise.deploy.api" export="true"/>
            <module name="javax.inject.api" export="true"/>
            <module name="javax.interceptor.api" export="true"/>
            <module name="javax.jms.api" export="true"/>
            <module name="javax.jws.api" export="true"/>
            <module name="javax.mail.api" export="true"/>
            <module name="javax.management.j2ee.api" export="true"/>
            <!-- <module name="javax.persistence.api" export="true"/> -->
            <module name="javax.resource.api" export="true"/>
            <module name="javax.rmi.api" export="true"/>
            <module name="javax.security.auth.message.api" export="true"/>
            <module name="javax.security.jacc.api" export="true"/>
            <module name="javax.servlet.api" export="true"/>
            <module name="javax.servlet.jsp.api" export="true"/>
            <module name="javax.transaction.api" export="true"/>
            <module name="javax.validation.api" export="true"/>
            <module name="javax.ws.rs.api" export="true"  services="export"/>
            <module name="javax.xml.bind.api" export="true"/>
            <module name="javax.xml.registry.api" export="true"/>
            <module name="javax.xml.soap.api" export="true"/>
            <module name="javax.xml.ws.api" export="true"/>

            <!-- This one always goes last. -->
            <module name="javax.api" export="true"/>
        </dependencies>
    </deployment>
    <sub-deployment name="CRVbusinessService.war">
        <dependencies>
            <module name="javax.xml.rpc.api"/>
            <module name="javax.wsdl4j.api"/>
        </dependencies>
        <exclusions>
            <module name="org.apache.commons.logging"/>
            <module name="org.apache.log4j"/>
            <module name="org.jboss.logging"/>
            <module name="org.jboss.logging.jul-to-slf4j-stub"/>
            <module name="org.jboss.logmanager"/>
            <module name="org.jboss.logmanager.log4j"/>
            <module name="org.slf4j"/>
            <module name="org.slf4j.impl"/>
        </exclusions>
    </sub-deployment>
    <sub-deployment name="restService.war">
        <local-last value="true" />
        <dependencies>
            <module name="deployment.jpa2.1"/>
        </dependencies>
        <exclusions>
            <module name="org.jboss.logging"/>
            <!--<module name="javax.validation"/>-->
            <module name="javaee.api" />
        </exclusions>
    </sub-deployment>
    <module name="deployment.jpa2.1" >
        <module-alias name="jpa2.1"/>
        <resources>
            <resource-root path="hibernate-jpa-2.1-api-1.0.0.Final.jar" />
        </resources>
    </module>
</jboss-deployment-structure>

但是我无法解决问题,因为我实际上收到了这个异常:

应用程序运行失败: org.springframework.beans.factory.BeanCreationException:错误 创建在类路径中定义的名称为“defaultValidator”的bean 资源 [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: 调用 init 方法失败;嵌套异常是 java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;

为了在此处提供更多详细信息,这里是 Spring Boot 应用程序 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>it.test.businessService</groupId>
        <artifactId>parent-parent</artifactId>
        <version>0.0</version>
    </parent>

    <groupId>com.crvservice</groupId>
    <artifactId>restService</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <org.springframework-version>5.0.9.RELEASE</org.springframework-version>
        <!--<hibernate.version>5.2.17.Final</hibernate.version>-->
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.16</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>development</id>
            <properties>
                <spring.profiles.active>dev</spring.profiles.active>
            </properties>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>production</id>
            <properties>
                <spring.profiles.active>ci</spring.profiles.active>
            </properties>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
        </profile>
    </profiles>
</project>

在 jboss-deployment-structure.xml 中添加 &lt;module name="javax.validation"/&gt; 似乎对解决其他类似问题没有帮助,这些问题通过在 Jboss 上添加相对排除来解决。我担心我的 Spring Boot 版本和所有连接的级联(例如休眠)太新,无法在此 JBoss 版本上正常运行。

我错过了什么吗?我环顾四周,但似乎很少有人真正需要这样做。

提前谢谢你。

【问题讨论】:

    标签: java hibernate maven spring-boot jboss


    【解决方案1】:

    问题似乎是由于 Jboss 6 仅支持 Spring Boot 版本 1.5.x 而不是 2.x。

    请记住 Spring boot 2.x 仅支持 Javax Servlet 3.1 而 Jboss 3.0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2012-04-03
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多