ошибки javax.persistence и jakarta.persistence classpath

#spring-boot #maven

#весенняя загрузка #maven

Вопрос:

У меня есть проект springboot, который использует jpa и olingo. Локально для тестирования все работает нормально, но когда я создаю файл war и запускаю его, я иногда получаю эту ошибку

 An attempt was made to call a method that does not exist. The attempt was made from the following location:

org.hibernate.cfg.AnnotationBinder.bindJoinedTableAssociation(AnnotationBinder.java:2531)

The following method did not exist:

javax.persistence.JoinTable.indexes()[Ljavax/persistence/Index;

The method's class, javax.persistence.JoinTable, is available from the following locations:

jar:file:/usr/sap/ljs/webapps/spring-boot-doeapis-0.0.1-SNAPSHOT/WEB-INF/lib/javax.persistence-2.0.5.jar!/javax/persistence/JoinTable.class
jar:file:/usr/sap/ljs/webapps/spring-boot-doeapis-0.0.1-SNAPSHOT/WEB-INF/lib/jakarta.persistence-api-2.2.3.jar!/javax/persistence/JoinTable.class

It was loaded from the following location:

file:/usr/sap/ljs/webapps/spring-boot-doeapis-0.0.1-SNAPSHOT/WEB-INF/lib/javax.persistence-2.0.5.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of javax.persistence.JoinTable
  

Теперь я пытаюсь выяснить, какая из библиотек, которые я использую, загружает javax.persistence или jakarata.persistence, чтобы я мог попытаться предотвратить ее загрузку. Я использую Maven, если это поможет.

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
        <olingo2.version>2.0.11</olingo2.version>
        <sap.cloud.sdk.version>3.99.14</sap.cloud.sdk.version>
    </properties>

    <groupId>gov.doe.ph</groupId>
    <artifactId>spring-boot-doeapis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-doeapis</name>
    <description>Doe project for Spring Boot</description>
    <packaging>war</packaging>

    <!--properties>
        <java.version>1.8</java.version>
        <olingo2.version>2.0.11</olingo2.version>
    </properties-->

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-spring-service-connector</artifactId>
            <version>1.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-cloudfoundry-connector</artifactId>
            <version>1.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
          <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <!--exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.tomcat.embed</groupId>
                    <artifactId>tomcat-embed-el</artifactId>
                </exclusion-->
                <exclusion>
                    <artifactId>logback-classic</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sap.cloud</groupId>
            <artifactId>neo-java-web-sdk</artifactId>
            <version>${sap.cloud.sdk.version}</version>
            <type>pom</type>
            <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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
         <!-- Olingo 2 Dependencies -->
        <dependency>
            <groupId>org.apache.olingo</groupId>
            <artifactId>olingo-odata2-core</artifactId>
            <version>${olingo2.version}</version>
            <!-- Avoid jax-rs version conflict by excluding Olingo's version -->
            <exclusions>
                <exclusion>
                    <groupId>javax.ws.rs</groupId>
                    <artifactId>javax.ws.rs-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.olingo</groupId>
            <artifactId>olingo-odata2-jpa-processor-core</artifactId>
            <version>${olingo2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.olingo</groupId>
            <artifactId>olingo-odata2-jpa-processor-ref</artifactId>
            <version>${olingo2.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.eclipse.persistence</groupId>
                    <artifactId>eclipselink</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-server -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>2.26</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
        <!-- <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1</version>
        </dependency> -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <!--dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>5.2.1.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 For unable to acquire JDBC connection error-->
        <!--dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency-->
        <!--dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.4.20.Final</version>
        </dependency-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!--plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.3</version>
                <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                    <goal>shade</goal>
                    </goals>
                    <configuration>
                    <relocations>
                        <relocation>
                        <pattern>org.apache.olingo.odata2.core.rest.ODataExceptionMapperImpl</pattern>
                        <shadedPattern>org.shaded.plexus.util</shadedPattern>
                        </relocation>
                    </relocations>
                    </configuration>
                </execution>
                </executions>
            </plugin-->
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>cf</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <packaging.type>jar</packaging.type>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        </profile>

        <profile>
            <id>neo</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <packaging.type>war</packaging.type>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                    <scope>provided</scope>
                </dependency>
                </dependencies>
        </profile>
    </profiles>

</project>
  

Я пытался постепенно удалять каждую библиотеку, пока она все еще компилируется, но я все еще получаю оба файла jar, поэтому теперь я хочу знать, как проверить, какие файлы jar загружает каждая из моих библиотек.

Обновление: Похоже, что именно spring-boot-starter-data-jpa получает jakarta.persistence, а olingo-odata2-jpa-processor-core, olingo-odata2-jpa-processor-ref и hibernate-testing используют javax.persistence. Я использую spring boot только короткое время, так что это действительно вызовет проблемы? Дело в том, что я не получаю ошибку постоянно. При перезапуске сервера иногда я получаю ошибку, а в других случаях — нет. Я действительно не могу понять, что вызывает появление ошибки.

Ответ №1:

Запустите mvn dependency:tree и найдите, какие зависимости зависят от javax.persistence и jakarta.persistence.

Затем вам нужно принять решение. Вы хотите использовать javax или jakarta?.

Если вы хотите использовать javax, вам нужно будет уменьшить версию библиотек, которая зависит от сохраняемости, пока вы не найдете javax из предыдущей команды. Если вы хотите использовать jakarta, вам нужно будет увеличить эти версии.

Важно то, что все зависимости совместимы с javax или jakarta.