JPMS/Jigsaw keycloak-spring-boot-starter(无效的模块名称和 ResolutionException)
JPMS/Jigsaw keycloak-spring-boot-starter (invalid module name & ResolutionException)
Java 11 maven 应用程序使用 JPMS/Jigsaw 模块化。
问题 1: keycloak-spring-boot-2-adapter invalid module-name '2'
解决方案 1: 通过删除“-2”的 maven 插件重命名。但我不确定这是否是一个好的解决方案。
<plugin>
<!-- for copying dependent libraries to folder lib -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>../lib</outputDirectory>
<excludeGroupIds>com.xyz</excludeGroupIds>
<excludeArtifactIds>keycloak-spring-boot-2-adapter</excludeArtifactIds>
</configuration>
</execution>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifacItem>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-2-adapter</artifactId>
<overWrite>true</overWrite>
<outputDirectory>../lib</outputDirectory>
<destFileName>keycloak-spring-boot-adapter-9.0.2.jar</destFileName>
</artifacItem>
</artifactItems>
<!-- other configurations here -->
</configuration>
</execution>
</executions>
</plugin>
问题2: keycloak.spring.boot.adapter和keycloak.spring.boot.adapter.core包名相同
java.lang.module.ResolutionException: Modules keycloak.spring.boot.adapter and keycloak.spring.boot.adapter.core export package org.keycloak.adapters.springboot to module org.yaml.snakeyaml
解决方案 2: ?
感谢您的帮助和最诚挚的问候,
皮埃尔
有一张票(KEYCLOAK-12499) with two sub tasks describing the two problems you're facing: KEYCLOAK-9072 (Problem 1) and KEYCLOAK-9073(问题2)。
第一个问题是一个微不足道的问题,无论是从您的角度还是从 Keycloak 的维护者的角度来看。
第二个问题然而需要更多的工作因为两个(实际上是三个)工件共享同一个包并且在它们被用作自动模块时导出它(因为自动模块导出他们所有的包裹)。
但是,不允许从多个模块导出相同的包 (http://openjdk.java.net/projects/jigsaw/spec/reqs/#non-interference)。
本题涉及的三个工件为keycloak-spring-boot-adapter-core, keycloak-spring-boot-adapter and keycloak-spring-boot-2-adapter。适配器核心工件的工作方式有点像其他两个模块的抽象实现,提供包私有 类 和其他两个模块使用的方法.
强调的文本是第二个问题的核心:在不同工件之间共享一个包适用于没有模块的经典 Java,但是模块系统会阻止它,因为它会破坏封装。
解决第二个问题需要你复制 keycloak-spring-boot-adapter-core
和 keycloak-spring-boot-2-adapter
并调整它们的代码——至少在官方工件修复之前是这样。
问题 2 的解决方案是构建自己的自动模块。
创建一个新模块并添加一个具有以下构建插件和依赖项的 POM。
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-2-adapter</artifactId>
<version>9.0.2</version>
<exclusions>
<exclusion>
<groupId> org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
...
</exclusions>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
</plugin>
<!-- Maven Assembly Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
<outputDirectory>../mods</outputDirectory>
<archive>
<manifestEntries>
<Automatic-Module-Name>modulename</Automatic-Module-Name>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>install-external</id>
<phase>install</phase>
<configuration>
<file>${project.basedir}/../mods/modulename-1.0-SNAPSHOT.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>com.xyz.assembly</groupId>
<artifactId>modulename</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
您可以通过 com.xyz.assembly 将依赖作为 groupID 添加到其他模块。
但请注意!
如果你不在这个汇编模块中排除它,它将使用log4j的模块-info.java。
Java 11 maven 应用程序使用 JPMS/Jigsaw 模块化。
问题 1: keycloak-spring-boot-2-adapter invalid module-name '2'
解决方案 1: 通过删除“-2”的 maven 插件重命名。但我不确定这是否是一个好的解决方案。
<plugin>
<!-- for copying dependent libraries to folder lib -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>../lib</outputDirectory>
<excludeGroupIds>com.xyz</excludeGroupIds>
<excludeArtifactIds>keycloak-spring-boot-2-adapter</excludeArtifactIds>
</configuration>
</execution>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifacItem>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-2-adapter</artifactId>
<overWrite>true</overWrite>
<outputDirectory>../lib</outputDirectory>
<destFileName>keycloak-spring-boot-adapter-9.0.2.jar</destFileName>
</artifacItem>
</artifactItems>
<!-- other configurations here -->
</configuration>
</execution>
</executions>
</plugin>
问题2: keycloak.spring.boot.adapter和keycloak.spring.boot.adapter.core包名相同
java.lang.module.ResolutionException: Modules keycloak.spring.boot.adapter and keycloak.spring.boot.adapter.core export package org.keycloak.adapters.springboot to module org.yaml.snakeyaml
解决方案 2: ?
感谢您的帮助和最诚挚的问候,
皮埃尔
有一张票(KEYCLOAK-12499) with two sub tasks describing the two problems you're facing: KEYCLOAK-9072 (Problem 1) and KEYCLOAK-9073(问题2)。
第一个问题是一个微不足道的问题,无论是从您的角度还是从 Keycloak 的维护者的角度来看。
第二个问题然而需要更多的工作因为两个(实际上是三个)工件共享同一个包并且在它们被用作自动模块时导出它(因为自动模块导出他们所有的包裹)。
但是,不允许从多个模块导出相同的包 (http://openjdk.java.net/projects/jigsaw/spec/reqs/#non-interference)。
本题涉及的三个工件为keycloak-spring-boot-adapter-core, keycloak-spring-boot-adapter and keycloak-spring-boot-2-adapter。适配器核心工件的工作方式有点像其他两个模块的抽象实现,提供包私有 类 和其他两个模块使用的方法.
强调的文本是第二个问题的核心:在不同工件之间共享一个包适用于没有模块的经典 Java,但是模块系统会阻止它,因为它会破坏封装。
解决第二个问题需要你复制 keycloak-spring-boot-adapter-core
和 keycloak-spring-boot-2-adapter
并调整它们的代码——至少在官方工件修复之前是这样。
问题 2 的解决方案是构建自己的自动模块。
创建一个新模块并添加一个具有以下构建插件和依赖项的 POM。
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-2-adapter</artifactId>
<version>9.0.2</version>
<exclusions>
<exclusion>
<groupId> org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
...
</exclusions>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
</plugin>
<!-- Maven Assembly Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
<outputDirectory>../mods</outputDirectory>
<archive>
<manifestEntries>
<Automatic-Module-Name>modulename</Automatic-Module-Name>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>install-external</id>
<phase>install</phase>
<configuration>
<file>${project.basedir}/../mods/modulename-1.0-SNAPSHOT.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>com.xyz.assembly</groupId>
<artifactId>modulename</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
您可以通过 com.xyz.assembly 将依赖作为 groupID 添加到其他模块。
但请注意! 如果你不在这个汇编模块中排除它,它将使用log4j的模块-info.java。