Gradle with Java 10(即使软件包未导出,Spring 也能扫描模块类)



所以我正在玩Spring和Java 10以及Gradle。

在我的应用程序中,我创建了 2 个模块

  • 用户界面
  • 应用

应用程序模块的 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 模块外部导出任何包,应用程序的模块信息也不需要 ui。

在主类中我添加了

@ComponentScan("com.factory_manager")

神奇的是,它能够扫描 UI 模块和 vaadin UI 类,我能够通过它们各自的端点访问它们。

据我了解,应用程序模块应该无法读取 ui 模块的类,因为我没有将任何包导出到外面。

有没有人知道 spring 如何神奇地扫描 ui 模块并找到 ui 类?

是的,我无法访问我的应用程序模块中的 UI 模块的类,但 spring 以某种方式能够。

不是很特定于gradle,但可能的原因可能是您的依赖代码 -

dependencies {
compile project (':ui')
} 

因此,ui模块类存在于类路径而不是模块路径上,并且位于未命名模块下。

为了进一步关联,未命名的模块会导出其所有包,因此您可以在不导出它们的情况下访问这些类。

首先,您可以确认这一点的一种方法是,通过尝试类似的东西 -

<yourClassFromUIModule>.class.getModule().isNamed(); //should return false

最新更新