-1

我正在尝试迁移一个曾经使用骆驼 2 和 jdk 8 的 maven 项目。我同时尝试使用更新版本的 spring 和 hibernate。

清理我的本地 maven .m2/ repo 后,“mvn clean install”工作,然后尝试“mvn clean package exec:java”,我有一个似乎与 spring-core 链接的 java.lang.NoSuchMethodError

我的 spring xml 配置文件导入了一个 databaseconfig.xml 文件,它是:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">



<!-- bean post processor to add advisor to repository bean so platform specific exceptions are caught efficiently ie. unchecked  -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>


<!-- needed so entitymanager can be injected in spring inside pricevectordaojpa  -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

    <context:property-placeholder location="classpath:config.properties"/>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${db.driverClassName}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="${db.type}" />
                <property name="showSql" value="false" />
            </bean>
        </property>
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.nodenet.domain" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.ejb.naming_strategy">${db.namingStrategy}</prop>
                <prop key="hibernate.hbm2ddl.auto">${db.hbm2ddl}</prop>
            </props>
        </property>
    </bean> 

    <bean id="jpa"  class="org.apache.camel.component.jpa.JpaComponent">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean> 

<tx:annotation-driven transaction-manager="jpaTransactionManager"/>

</beans>



看起来这是创建一些问题的文件,因为找不到某些 spring-core 类/依赖项,因为我收到以下错误:


根据 burki 的评论,我已经使用强制执行器 maven 插件和 pom.xml 中的排除项清理了传递的 spring 依赖项,并且它有效

4

1 回答 1

1

我猜你混合了具有不同版本的 Spring 依赖项。可能存在由其他依赖项(如 ActiveMQ 或其他)拉取的传递 Spring 依赖项。

所有 Spring 框架依赖项必须具有相同的版本,在您的情况下为 5.1.14.RELEASE。

使用IDE 的依赖管理来获取所有项目依赖的列表,或者使用Maven 依赖插件来列出依赖树

您还可以使用Maven 执行器插件来解决依赖冲突。但我认为它不会抱怨旧版本的单个 Spring 依赖项。

自我管理的替代方案

另一个策略是利用 Spring Boot 社区的优秀作品来构建一个运行良好的依赖版本生态系统

请注意,以下定义只是添加了依赖管理,而不是真正的依赖!

您可以通过将 Spring Boot POM 声明为父 POM 来使用它。

<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>2.1.7.RELEASE</version>
    <relativePath />
</parent>

如果你不使用 Spring Boot 或者你的 parent 已经在使用,你也可以只使用依赖管理部分。这个版本只定义了依赖版本,而父 POM 也定义了 Maven 插件版本

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

使用 POM 中的这些定义之一,您可以省略大多数依赖项版本以使用 Spring Boot 已经定义的版本。

以 Spring Boot 2.1.7 版本的依赖定义为例。

Spring Boot 文档中描述了这两种变体以获取更多详细信息。

于 2020-03-03T06:13:02.993 回答