拼图"requires transitive"不起作用



嗨,我目前遇到"需要传递"指令无法在我的依赖模块中打开使用的模块的问题。

为了熟悉拼图,我开始使用 spring 和 JDK 10 编写一个新的应用程序。我得到了一个名为">database"的模块,它使用spring.data.jpa模块。此外,我得到了一个名为">mvc"的第二个模块,它需要模块">数据库"。

现在在模块信息中.java在模块">数据库"中,我定义 spring 模块如下:

requires transitive spring.data.jpa;

我希望在我的模块">mvc"中也提供此模块,但我没有。有什么建议我做错了什么吗?

模块信息.java模块数据库

module database {
requires java.sql;
requires java.persistence;
requires liquibase.core;
requires spring.beans;
requires transitive spring.data.jpa;
requires spring.jdbc;
requires spring.tx;
requires spring.orm;
exports de.database.entities to mvc;
exports de.database.repositories to mvc;
}

模块信息.java模块MVC

module mvc {
requires database;
requires spring.context;
requires spring.beans;
requires spring.boot;
exports de.mvc to application;
}

正如我所说,spring.data.jpa无法在模块MVC中访问。此外,require指令要求spring.data.jpa是不可能的。

编辑:

database -> build.gradle

dependencies {
implementation(group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa')
implementation group: 'org.hsqldb', name: 'hsqldb'
implementation group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api'
implementation(group: 'org.liquibase', name: 'liquibase-core')
implementation group: 'javax.xml.bind', name: 'jaxb-api'
testImplementation (group: 'org.springframework.boot', name: 'spring-boot-starter-log4j2')
}

MVC -> build.gradle

dependencies {
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-log4j2'
implementation (group: 'org.springframework.boot', name: 'spring-boot-starter') {
force = true
exclude group: 'ch.qos.logback', module: 'logback-classic'
exclude group: 'commons-logging', module: 'commons-logging'
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
//    implementation group: 'org.springframework.data', name: 'spring-data-jpa'
implementation project(":database")
}

这里的问题是,如果我在模块mvc中不注释依赖项spring-data-jpa,编译将失败。我需要在build.gradle中显式启用它,即使它应该作为数据库模块的传递依赖项存在。

那么我的错误是

> Task :mvc:compileJava FAILED
error: module not found: spring.data.jpa
1 error

我尝试模块化数据库部分。数据库部分使用弹簧存储库。所以我使用模块spring.data.jpa中的接口JpaRepository,如下所示:

@Repository
public interface DestinationDao
extends JpaRepository<Destination, Long>, JpaSpecificationExecutor<Destination>
{
}

现在我想在我的模块mvc中使用这个 bean。在我看来,即使我没有在模块mvc中明确定义对 spring-data-jpa 的依赖关系,这也应该有效。

你的模块声明是正确的,mvc应该读spring.data.jpa

我猜你遇到了编译错误?我不是 Gradle 专家,所以我在这里可能是错的,但我认为 Gradle 有一种模式,它在编译过程中只使用直接依赖项。如果spring.data.jpa不在mvc的依赖列表中(在Gradle中(,那么这将解释这个问题。

要弄清楚这一点,请使用--debug运行 Gradle 并查找调试消息"编译器参数:"。

如果不是这种情况,请准确分享您遇到的错误时间和内容。

最新更新