Gradle with Java 10(Spring 能够扫描模块 类 即使包未导出)
Gradle with Java 10 (Spring able to scan module classes even when package not exported)
所以我在玩 Spring 和 Java 10 以及 Gradle。
在我的应用程序中,我创建了 2 个模块
- UI
- 申请
应用程序模块的 gradle 文件如下所示
dependencies {
compile project (':ui')
}
模块信息文件如下所示
module application {
requires spring.context;
requires spring.boot.autoconfigure;
requires spring.boot;
}
在我的 UI 模块中,build.gradle 看起来像这样
dependencies {
compile('com.vaadin:vaadin-spring-boot-starter')
}
dependencyManagement {
imports {
mavenBom "com.vaadin:vaadin-bom:${vaadinVersion}"
}
}
模块信息看起来像这样
module ui {
requires vaadin.server;
requires vaadin.spring;
}
所以我的 UI 代码位于 ui 模块中。如您所见,我没有从 ui 模块导出任何包,应用程序的模块信息也没有 require ui.
在主体class中我添加了
@ComponentScan("com.factory_manager")
神奇的是它能够扫描 UI 模块和 vaadin UI classes 并且我能够通过它们各自的端点访问它们。
根据我的理解,应用程序模块应该无法读取 ui 模块的 classes,因为我没有向外导出任何包。
有谁知道 spring 是如何神奇地扫描 ui 模块并找到 ui classes 的?
是的,我无法在我的应用程序模块中访问 UI 模块的 classes,但是 spring 以某种方式能够..
不是很 gradle 具体,但可能的原因可能是您的依赖代码 -
dependencies {
compile project (':ui')
}
因此 ui
模块 类 出现在类路径而不是模块路径上,并且在 the unnamed module.
下
为了进一步关联,未命名模块 导出了它的所有包 因此您可以访问那些 类 而无需导出它们。
最重要的是,您可以通过尝试类似的方法来确认这一点 -
<yourClassFromUIModule>.class.getModule().isNamed(); //should return false
所以我在玩 Spring 和 Java 10 以及 Gradle。
在我的应用程序中,我创建了 2 个模块
- UI
- 申请
应用程序模块的 gradle 文件如下所示
dependencies {
compile project (':ui')
}
模块信息文件如下所示
module application {
requires spring.context;
requires spring.boot.autoconfigure;
requires spring.boot;
}
在我的 UI 模块中,build.gradle 看起来像这样
dependencies {
compile('com.vaadin:vaadin-spring-boot-starter')
}
dependencyManagement {
imports {
mavenBom "com.vaadin:vaadin-bom:${vaadinVersion}"
}
}
模块信息看起来像这样
module ui {
requires vaadin.server;
requires vaadin.spring;
}
所以我的 UI 代码位于 ui 模块中。如您所见,我没有从 ui 模块导出任何包,应用程序的模块信息也没有 require ui.
在主体class中我添加了
@ComponentScan("com.factory_manager")
神奇的是它能够扫描 UI 模块和 vaadin UI classes 并且我能够通过它们各自的端点访问它们。
根据我的理解,应用程序模块应该无法读取 ui 模块的 classes,因为我没有向外导出任何包。
有谁知道 spring 是如何神奇地扫描 ui 模块并找到 ui classes 的?
是的,我无法在我的应用程序模块中访问 UI 模块的 classes,但是 spring 以某种方式能够..
不是很 gradle 具体,但可能的原因可能是您的依赖代码 -
dependencies {
compile project (':ui')
}
因此 ui
模块 类 出现在类路径而不是模块路径上,并且在 the unnamed module.
为了进一步关联,未命名模块 导出了它的所有包 因此您可以访问那些 类 而无需导出它们。
最重要的是,您可以通过尝试类似的方法来确认这一点 -
<yourClassFromUIModule>.class.getModule().isNamed(); //should return false