Spring 作为 Java9/Jigsaw 模块启动实现

Spring Boot implementation as Java9/Jigsaw Module

我创建了一个简单的 Spring 引导拦截器 class 和配置 class 以将该拦截器添加到拦截器列表中。这是在项目的模块中。

这是通过 Maven 管理的,结构类似于:

.
├── interceptors
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   ├── com
│   │   │   │   │   └── mypackage
│   │   │   │   │      ├── config
│   │   │   │   │      │   ├── MyConfig.java
│   │   │   │   │      │   └── package-info.java
│   │   │   │   │      └── interceptors
│   │   │   │   │          ├── MyInterceptor.java
│   │   │   │   │          └── package-info.java
│   │   │   │   └── module-info.java
│   │   └── test
│   └── target
├── pom.xml
└── target

该项目使用 Maven 并具有一些外部 Spring 依赖项。

我的 classes 上有以下导入:

我的拦截器:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

import org.slf4j.MDC;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

我的配置:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.mypackage.interceptors.MyInterceptor;

代码在 IDE 和使用 Maven 中都可以正常运行和编译。

我添加了一个 module-info.java 文件,但导入不再有效。因此,该项目将无法编译。

为了修复导入问题,我在 module-info.java 文件中添加了以下内容:

module interceptors {
    requires slf4j.api;
    requires spring.core;
    requires spring.webmvc;
    requires spring.context;
    requires org.apache.tomcat.embed.core;

    exports com.mypackage.config;
    exports com.mypackage.interceptors;
}

执行此操作后,导入将不再显示为红色,但是当我执行 maven 全新安装时,出现以下错误:

module not found: slf4j.api
module not found: spring.core
module not found: spring.webmvc
module not found: spring.context
module not found: org.apache.tomcat.embed.core

如果我将它们添加为 Maven 依赖项,行为仍然相同。

有人可以用简单的英语向我解释我做错了什么以及如何解决这个问题吗?我是 Jigsaw 这个项目的新手。

用例:此模块稍后将添加到另一个 Spring 引导项目,并用作依赖项,用于使用外部配置源自动配置 bean。所以,我正在编写这个拦截器 class 以便每个 Spring 项目都将使用它而不是复制粘贴实现。我假设我需要这个 module-info.java 来将它暴露给其他包。如有不妥请指正

This module will later be added to another Spring Boot project and used as dependency there 在 spring 引导应用程序中使用模块通常没有任何意义,因为您最终会得到一个 jar 文件。 module-info 对于由多个 jar 文件或用作库的 jar 文件组成的应用程序通常 needed/used。

所有 spring/spring boot jar 还不是 java 模块(这意味着它们没有任何 module-info.class 文件...但是它们有一个automatic-module-name MANIFEST.MF) 和 tomcat-embed 中的条目甚至不包含 automatic-module-name.

添加 Maven 依赖项并不意味着您可以将依赖项用作 java 模块...它至少需要 automatic-module-name 等