在自定义事件侦听器中找不到 Keycloak 管理客户端

问题描述 投票:0回答:2

我正在为 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,但没有成功。

maven keycloak keycloak-rest-api
2个回答
0
投票

我的猜测是管理客户端不是 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 更加高效。


0
投票

您的包中必须有外部依赖项。 您可以使用

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>
© www.soinside.com 2019 - 2024. All rights reserved.