我尝试将我开始开发的无模块 Spring Boot 项目迁移到 Java 9 Jigsaw 架构。
我不明白为什么,但是在构建我的service模块(这取决于我的common模块)时,无法访问common的类。
注意:我所有的
module-info.java
文件都在每个模块的src/main/java
文件夹下。
提前谢谢您,我不知道我的配置有什么问题......
这是当我尝试在项目的根文件夹中执行
mvn clean install
时得到的结果:
...
[INFO] 54 errors
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] server 0.0.1-SNAPSHOT .............................. SUCCESS [ 2.449 s]
[INFO] common ............................................. SUCCESS [ 4.242 s]
[INFO] service ............................................ FAILURE [ 3.058 s]
[INFO] api 0.0.1-SNAPSHOT ................................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.602 s
[INFO] Finished at: 2018-03-25T18:40:01+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project service: Compilation failure: Compilation failure:
[ERROR] /D:/lastfm-playlists-workspace/lastfm-playlists-server/service/src/main/java/com/lastfm/playlists/server/service/api/converter/lastfm/common/LastfmApiTrackDto_to_LovedTrackDto_Converter.java:[3,55] package com.lastfm.playlists.server.common.model.lastfm does not exist
...
这是我的主要
pom.xml
:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lastfm.playlists</groupId>
<artifactId>server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>api</module>
<module>service</module>
<module>common</module>
</modules>
<packaging>pom</packaging>
<name>server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.target>1.9</maven.compiler.target>
<maven.compiler.source>1.9</maven.compiler.source>
<java.version>9</java.version>
<lombok.version>1.16.21</lombok.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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-edge</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.lastfm.playlists.server.api.Application</mainClass>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>9</source>
<target>9</target>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
</plugins>
</build>
</project>
我的
common
模块pom.xml
:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>server</artifactId>
<groupId>com.lastfm.playlists</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.lastfm.playlists.server</groupId>
<artifactId>common</artifactId>
<packaging>jar</packaging>
<name>common</name>
</project>
相关
module-info.java
:
module common {
requires slf4j.api;
requires jackson.annotations;
requires lombok;
requires spring.data.commons;
requires spring.data.mongodb;
requires java.validation;
requires spring.core;
exports com.lastfm.playlists.server.common.utils;
exports com.lastfm.playlists.server.common.model;
exports com.lastfm.playlists.server.common.model.lastfm;
}
我的
service
模块pom.xml
:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>server</artifactId>
<groupId>com.lastfm.playlists</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.lastfm.playlists.server</groupId>
<artifactId>service</artifactId>
<packaging>jar</packaging>
<name>service</name>
<dependencies>
<dependency>
<groupId>com.lastfm.playlists.server</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
相关
module-info.java
:
module service {
requires slf4j.api;
requires spring.beans;
requires spring.context;
requires spring.core;
requires spring.web;
requires lombok;
requires jackson.annotations;
requires common;
exports com.lastfm.playlists.server.service.api;
exports com.lastfm.playlists.server.service.api.lastfm.exception;
}
还有我的
api
模块pom.xml
:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>server</artifactId>
<groupId>com.lastfm.playlists</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.lastfm.playlists.server</groupId>
<artifactId>api</artifactId>
<packaging>jar</packaging>
<name>api</name>
<dependencies>
<dependency>
<groupId>com.lastfm.playlists.server</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lastfm.playlists.server</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
相关
module-info.java
:
module api {
requires spring.boot;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.web;
requires spring.beans;
requires spring.data.commons;
requires java.validation;
requires slf4j.api;
requires common;
requires service;
requires spring.data.mongodb;
}
该问题与 Java 9 模块、Maven 多模块或 Lombok 项目无关,而是与 Spring Boot Maven 插件 有关(并且它仍然是最新的 Spring Boot 3.3.5)。
只需从主
spring-boot-maven-plugin
中剪切并粘贴 pom.xml
并将其放入实际的应用程序可执行文件中(可能是 api
模块)。
将此插件放在根目录中
pom.xml
会导致每个子模块继承它并成为可执行的Spring Bootjar
,这意味着包含所有依赖项的大jar
文件(可能在模块之间重复)和非常不同的内部类结构;这可能不是你想要的。根据文档:
该插件可以创建包含应用程序所有依赖项的可执行档案(jar 文件和 war 文件),然后可以使用 java -jar 运行。
这也是为什么您可能只在尝试
package
模块时才会收到此错误,但在 IDE 中一切正常。所以,你不能依赖带有这样的插件的模块,问题是:
默认情况下,重新打包目标会将原始工件替换为重新打包的工件。对于代表应用程序的模块来说,这是一种合理的行为,但如果您的模块用作另一个模块的依赖项,则需要为重新打包的模块提供一个分类器。原因是应用程序类打包在 BOOT-INF/classes 中,因此依赖模块无法加载重新打包的 jar 的类。