我正在为 keycloak 开发一个自定义事件监听器,我需要管理客户端 (keycloak-admin-client) 来使用一些方法。我已在 pom 文件中添加了依赖项,并使用以下命令生成 jar:
mvn clean install
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<keycloak.version>20.0.2</keycloak.version>
<maven-compiler-plugin.version>3.10.0</maven-compiler-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi</artifactId>
<version>${keycloak.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi-private</artifactId>
<version>${keycloak.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
<version>${keycloak.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<version>${keycloak.version}</version>
</dependency>
</dependencies>
我收到的错误是:
2023-01-27 17:33:47,009 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-4) Uncaught server error: java.lang.NoClassDefFoundError: org/keycloak/admin/client/Keycloak
还尝试过
<scope>provided</scope>
。我已经审阅了这篇文章:KeyCloak 自定义 REST 端点 - 未找到管理客户端类,它暴露了相同的问题。
已编辑:在使用 org.keycloak.authentication.authenticators.broker.util 中的类时,在提供程序 jar 中尝试了NoClassDefFoundError,但没有成功。
我的猜测是管理客户端不是 Keycloak 服务器的一部分。您必须将其添加到 keycloak 服务器中的
/opt/keycloak/providers
,就像您对自定义提供程序所做的那样。我使用 maven-dependency-plugin
将所有依赖项复制到 target/dependency
文件夹中。然后我通过 Dockerfile 将它们添加到 /opt/keycloak/providers
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
...
COPY ./dependency/*.jar /opt/keycloak/providers/
COPY *.jar /opt/keycloak/providers/
...
我故意分两步完成此操作,因为依赖项的更改频率低于您自己编写的提供程序,这使得构建 Dockerfile 更加高效。
您的包中必须有外部依赖项。 您可以使用
maven-shade-plugin
进行配置。
在我这边,我必须添加所有这些依赖项:
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<version>${keycloak.version}</version>
</dependency>
<!--Resteasy-->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.wildfly.client</groupId>
<artifactId>wildfly-client-config</artifactId>
<version>1.0.1.Final</version>
</dependency>
</dependencies>
配置此构建:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>org.keycloak:keycloak-admin-client:*</include>
<include>org.jboss.resteasy:resteasy-client:*</include>
<include>org.jboss.resteasy:resteasy-client-api:*</include>
<include>org.wildfly.client:*</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</buils>
使用这些版本:
<properties>
<keycloak.version>20.0.2</keycloak.version>
<resteasy.version>4.7.5.Final</resteasy.version>
</properties>