首页 > 解决方案 > JPMS/Jigsaw keycloak-spring-boot-starter(无效的模块名称和ResolutionException)

问题描述

Java 11 maven 应用程序使用 JPMS/Jigsaw 进行了模块化。

问题 1: keycloak-spring-boot-2-adapter 无效模块名 '2'

解决方案 1:由 maven 插件重命名,删除“-2”。但我不确定这是否是一个好的解决方案。

<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:?

感谢您的帮助和最诚挚的问候,

皮埃尔

标签: spring-bootmavenkeycloakjava-platform-module-system

解决方案


有一张票 ( KEYCLOAK-12499 ) 包含两个子任务,描述了您面临的两个问题:KEYCLOAK-9072(问题 1)和KEYCLOAK-9073(问题 2)。

第一个问题是一个微不足道的问题,无论是从您的角度还是从 Keycloak 维护者的角度来看。

然而,第二个问题需要更多的工作,因为两个(实际上是三个)工件共享同一个包,并且当它们用作自动模块时正在导出它(因为自动模块导出它们的所有包)。
但是,不允许从多个模块中导出同一个包(http://openjdk.java.net/projects/jigsaw/spec/reqs/#non-interference)。
这个问题涉及的三个工件是keycloak-spring-boot-adapter-corekeycloak-spring-boot-adapterkeycloak-spring-boot-2-adapter。适配器核心工件有点像其他两个模块的抽象实现,提供其他两个模块使用的包私有类和方法
强调的文本是第二个问题的核心:跨不同工件共享包适用于没有模块的经典 Java,但模块系统阻止了这一点,因为它破坏了封装。
解决第二个问题需要您复制keycloak-spring-boot-adapter-corekeycloak-spring-boot-2-adapter调整他们的代码——至少在官方工件得到修复之前是这样。


推荐阅读