如何解决NoClassDefFoundError - 具有多个子模块的 IntelliJ 项目中的 MongoRepository
我有一个包含多个子模块的 IntelliJ 项目。其中一个子模块 generator 依赖于子模块 queue 中定义的代码。 Queue 使用 MongoDB 进行一些操作。 当我运行生成器项目时,我得到:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'queue': Resolution of declared constructors on bean Class [com.example.queuesystem.queue.Queue] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@fb9c4ee9] Failed; nested exception is java.lang.NoClassDefFoundError: org.springframework.data.mongodb.repository.MongoRepository
我尝试了类似问题中提到的几件事,特别是:
- 我在生成器应用程序的
scanBasePackages
注释中添加了SpringBootApplication
,即@SpringBootApplication(scanBasePackages = {"com.example.queue"})
- 我将
@EnableMongoRepositories
添加到队列应用中:@EnableMongoRepositories(basePackageClasses = {TaskRepo.class,QueueRepo.class})
- 在
application.properties
中,我有:
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=db
- 有人建议向 pom.xml 添加版本。那没有帮助。
- 我是运行配置,我从
Enable JMX Agent
中删除了勾号 - 我不仅在 generator 的 pom 中指定了队列,而且我还在(子)模块设置中手动添加了它作为依赖项。
- 队列类本身被标记为一个组件:
@Component
public class Queue implements IQueue {
private final QueueRepo queueRepo;
private final TaskRepo taskRepo;
@Autowired
public Queue(QueueRepo queueRepo,TaskRepo taskRepo) {
this.queueRepo = queueRepo;
this.taskRepo = taskRepo;
}
这是生成器的pom:
<?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.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>generator</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>queue</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里是队列:
<?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.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>queue</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>queue</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这里也是父项目的 pom,即 queue 和 generator 所在的那个:
<?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.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>app</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
是否需要此信息,QueueRepo extends MongoRepository
,而 TaskRepo
使用 MongoTemplate
。
当我运行 lsof -i tcp:27017
时,我得到的答案是 mongod 正在这个端口上运行。
你知道这里有什么问题吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。