верблюд 3 openjdk 11 hibernate / jpa java .lang.NoSuchMethodError - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь перенести проект maven, который раньше работал с верблюдом 2 и jdk 8. Я одновременно пытаюсь использовать более свежую версию spring и hibernate.

После очистки моего локального maven .m2 / repo, «mvn clean install» работает, затем пытается «mvn clean package exe c: java», у меня есть java .lang.NoSuchMethodError, который, кажется, связан с spring-core

Мой весенний 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 не обнаружен, потому что я получаю следующую ошибку:


Следуя комментариям Бурки, я очистил переходные пружинные зависимости с помощью плагина принудительного применения maven и исключений в моем pom. xml, и это сработало

1 Ответ

1 голос
/ 03 марта 2020

Я полагаю, у вас есть смесь зависимостей Spring с разными версиями . Вероятно, существуют переходные зависимости Spring, извлекаемые другими зависимостями, такими как ActiveMQ или чем-то еще.

Все зависимости Spring Framework должны иметь одинаковую версию , в вашем случае 5.1.14.RELEASE.

Используйте управление зависимостями вашей IDE , чтобы получить список всех зависимостей проекта, или используйте Плагин зависимостей Maven для отображения дерева ваших зависимостей .

Вы также можете использовать Плагин Maven Enforcer для разрешения конфликтов зависимостей. Но я думаю, что он не будет жаловаться на отдельные зависимости Spring с более старой версией.

Альтернатива самоуправлению

Другая стратегия заключается в использовании отличной работы Spring Загрузите сообщество для создания экосистемы зависимых версий, которая работает достаточно хорошо .

Обратите внимание, что следующие определения просто добавляют управление зависимостями, а не реальные зависимости!

Вы можете использовать его, объявив POM Spring Boot своим родительским POM.

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

Если вы не используете Spring Boot или ваш родитель уже используется, вы также можете использовать только часть управления зависимостями. Эта версия определяет только версии зависимостей , в то время как родительский 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 документах для дальнейших деталей.

...