我正在使用
Java
和 Gradle
来编译和测试 我的项目。
运行 gradle -v
输出以下内容:
gradle -v
------------------------------------------------------------
Gradle 7.4.2
------------------------------------------------------------
Build time: 2022-03-31 15:25:29 UTC
Revision: 540473b8118064efcc264694cbcaa4b677f61041
Kotlin: 1.5.31
Groovy: 3.0.9
Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM: 21.0.1 (Microsoft 21.0.1+12-LTS)
OS: Linux 5.15.0-89-generic amd64
代码库在
Java 11
下工作,利用 build.gradle
文件中定义的以下库 Gradle
:
plugins {
id 'org.springframework.boot' version '2.2.0.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java-library'
}
group = 'pt.ist.meic'
version = '1.2.0'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
testImplementation(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.2.2.RELEASE') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation group: 'org.openjdk.jmh', name: 'jmh-generator-annprocess', version: '1.19'
api group: 'org.openjdk.jmh', name: 'jmh-core', version: '1.19'
api group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.0'
api group: 'com.google.api-client', name: 'google-api-client', version: '1.30.9'
implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
}
test {
useJUnitPlatform()
}
最近我将几个依赖项更新到最新版本,并引发了似乎是弃用和兼容性问题。 这要求我还将
Java 17
设置为目标。
为了支持这个版本,我也更新了Gradle
:
gradle -v
------------------------------------------------------------
Gradle 8.4
------------------------------------------------------------
Build time: 2023-10-04 20:52:13 UTC
Revision: e9251e572c9bd1d01e503a0dfdf43aedaeecdc3f
Kotlin: 1.9.10
Groovy: 3.0.17
Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM: 21.0.1 (Microsoft 21.0.1+12-LTS)
OS: Linux 5.15.0-89-generic amd64
这是我更新的
build.gradle
文件。
我不确定这是否 100% 正确,因为我必须尝试不同的方法才能编译它:
plugins {
id 'org.springframework.boot' version '3.1.5'
id 'io.spring.dependency-management' version '1.1.4'
id 'java-library'
}
version = '1.2.0'
group = 'pt.ist.meic'
description = "PhyloDB Docker Container App"
java {
sourceCompatibility = JavaVersion.VERSION_17
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.neo4j:neo4j-ogm-core:4.0.8'
implementation 'org.neo4j:neo4j-ogm-bolt-driver:4.0.8'
// https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api
implementation group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '6.0.0'
// https://mvnrepository.com/artifact/org.springframework/spring-core
implementation group: 'org.springframework', name: 'spring-core', version: '6.1.0'
// https://mvnrepository.com/artifact/org.springframework/spring-web
implementation group: 'org.springframework', name: 'spring-web', version: '6.1.0'
api group: 'org.openjdk.jmh', name: 'jmh-core', version: '1.37'
api group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.16.0'
api group: 'com.google.api-client', name: 'google-api-client', version: '2.2.0'
implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
testImplementation group: 'org.springframework', name: 'spring-core', version: '6.1.0'
testImplementation group: 'org.springframework', name: 'spring-web', version: '6.1.0'
// https://mvnrepository.com/artifact/org.springframework/spring-context
testImplementation group: 'org.springframework', name: 'spring-context', version: '6.1.0'
testImplementation(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '3.1.5') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation('org.junit.jupiter:junit-jupiter')
testImplementation('org.neo4j:neo4j-ogm-core:4.0.8')
testImplementation('org.neo4j:neo4j-ogm-bolt-driver:4.0.8')
testImplementation group: 'org.openjdk.jmh', name: 'jmh-generator-annprocess', version: '1.37'
}
test {
useJUnitPlatform()
}
编译似乎工作正常:
gradle bootJar
> Task :compileJava
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
BUILD SUCCESSFUL in 7s
4 actionable tasks: 4 executed
但是,当我尝试执行生成的 JAR 文件时,出现以下错误:
java -jar build/libs/phylodb-1.2.0.jar
18:51:24.545 [main] INFO p.i.meic.phylodb.PhylodbApplication - Starting
PhylodbApplication v1.2.0 using Java 21.0.1 with PID 198252
(/home/user/phyloDB-official.git/phylodb/build/libs/phylodb-1.2.0.jar started
by user in /home/user/phyloDB-official.git/phylodb)
18:51:24.547 [main] INFO p.i.meic.phylodb.PhylodbApplication -
No active profile set, falling back to 1 default profile: "default"
18:51:26.485 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
18:51:26.486 [main] INFO o.a.catalina.core.StandardEngine -
Starting Servlet engine: [Apache Tomcat/10.1.15]
18:51:26.575 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/]
- Initializing Spring embedded WebApplicationContext
18:51:26.654 [main] INFO o.a.catalina.core.StandardService
- Stopping service [Tomcat]
18:51:26.702 [main] ERROR o.s.boot.SpringApplication -
Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'profileService' defined in URL
[jar:file:/home/user/phyloDB-official.git/phylodb/build/libs/phylodb-1.2.0.jar!/BOOT-INF/classes!/pt/ist/meic/phylodb/typing/profile/ProfileService.class]:
Unsatisfied dependency expressed through constructor parameter 0:
Error creating bean with name 'datasetRepository' defined in URL
[jar:file:/home/user/phyloDB-official.git/phylodb/build/libs/phylodb-1.2.0.jar!/BOOT-INF/classes!/pt/ist/meic/phylodb/typing/dataset/DatasetRepository.class]:
Unsatisfied dependency expressed through constructor parameter 0:
Error creating bean with name 'org.neo4j.ogm.session.Session':
Failed to instantiate [org.neo4j.ogm.session.Session]: Specified class is an interface
特别是,以前版本的
Java
和依赖项没有出现以下错误:
Error creating bean with name 'org.neo4j.ogm.session.Session':
Failed to instantiate [org.neo4j.ogm.session.Session]: Specified class is an interface
... (I omitted the remaining errors)
我正在尝试了解可能导致此问题出现的原因。 虽然
org.neo4j.ogm.session.Session
确实是 Java interface
,但这在过去是有效的,所以我相信 Spring 框架加载类的方式可能有问题。
我们正在使用诸如 @Repository
之类的注释,例如 在此文件中,这是错误的触发器之一。
此链接中的
UserRepository
类有一个构造函数,该构造函数接收 org.neo4j.ogm.session.Session
的实例(实现)作为参数。
由于某种原因,在更新 Java
、Gradle
和依赖项后,Spring 框架不再能够创建 org.neo4j.ogm.session.Session
的实例,尽管我不知道它在以前的版本中是如何做到的...
我通常使用
Maven
但这是在 Gradle
中完成的,所以我的目的是了解它是如何设计的。
我不确定这些软件包中的哪一个可能是导致头痛的原因:
implementation 'org.neo4j:neo4j-ogm-core:4.0.8'
implementation 'org.neo4j:neo4j-ogm-bolt-driver:4.0.8'
implementation group: 'org.springframework', name: 'spring-core', version: '6.1.0'
implementation group: 'org.springframework', name: 'spring-web', version: '6.1.0'
implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-web'
任何见解将不胜感激!
我发现的第一件事是,您从 Spring Boot 2.2 直接跳转到 3.1。而且,即使这听起来很刺耳,在这种情况下,可能最少的问题是 Java 17 基线。
重点关注 Spring Data Neo4j 和 Neo4j-OGM 依赖项: Spring Data Neo4j 在版本 5 和版本 6 之间发生了重大变化(发生在 Spring Boot 2.4 中)。
此更改从 Spring Data Neo4j 中删除了所有 Neo4j-OGM 依赖项,更重要的是,SDN 被完全重写并且现在拥有自己的对象映射。
话虽如此,我不确定到底是什么导致了您所面临的异常。新版本中 SDN 的 Spring Boot 自动配置不知道任何 Neo4j-OGM 类,也不会触及它。 也许这并不重要,让我们解决您的问题。
您有两个选择: 要么升级到新的 Spring Data Neo4j 堆栈,要么坚持使用旧的 Spring Data Neo4j 和 Neo4j-OGM 的“经典”组合。
第一个需要根据您当前的项目进行一些工作。 Spring Data Neo4j 不再支持 Neo4j-OGM 的某些功能,例如以工作关系为中心。结果映射更加严格。 如果您愿意走这条路,这里有一个样板迁移指南:https://docs.spring.io/spring-data/neo4j/reference/appendix/migration.html (因为它会完全使该线程爆炸,https://community.neo4j.com/c/drivers-stacks/spring-data-neo4j-ogm/30将是在迁移期间询问项目特定问题的最佳位置).
另一个选项,坚持使用 Neo4j-OGM/SDN 组合,由 https://github.com/neo4j/neo4j-ogm-spring 支持,这是初始 Spring Data Neo4j 5 的一个分支,与Neo4j-OGM 和 Spring Boot 的最新版本。有关如何使用自定义启动器的信息,请参阅自述文件。另请记住,该项目并不总是与最新版本保持同步,而是尽最大努力进行维护。