我正在使用 Keycloak Admin REST 客户端的自定义提供程序构建基于 Keycloak 18 的 docker 映像。我认为我还需要捆绑一些依赖项,因此我使用
maven-dependency-plugin
创建了 jar 文件并包含了这些文件。
这是我的 Dockerfile:
FROM maven:3.6.0-jdk-11-slim AS javabuild
ENV HOME=/home/app
RUN mkdir -p $HOME
WORKDIR $HOME
ADD pom.xml $HOME
ADD my-provider/pom.xml $HOME/my-provider/pom.xml
RUN mvn -pl my-provider verify --fail-never
ADD my-provider $HOME/my-provider
RUN rm -rf ${HOME}/my-provider/target
RUN mvn -pl my-provider install
RUN mvn -pl my-provider package
FROM quay.io/keycloak/keycloak:18.0.0 as builder
COPY --from=javabuild /home/app/my-provider/target/my-provider*.jar /opt/keycloak/providers/
COPY --from=javabuild /home/app/my-provider/target/dependency/*.jar /opt/keycloak/providers/
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:18.0.0
COPY --from=builder /opt/keycloak/ /opt/keycloak/
WORKDIR /opt/keycloak
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start-dev", "--db=postgres"]
我很难理解我到底应该提供什么以及如何提供。
我尝试直接使用
keycloak-admin-client
并且仅将其添加为依赖项,并且没有临时依赖项,因为看起来 Keycloak 已经具有这些依赖项,因为从 Keycloak 17 开始他们使用 Quarkus。我对 Quarkus 不太了解,但查看我发现的 docker 容器文件:
bash-4.4$ ls | grep "rest"
com.openshift.openshift-restclient-java-8.0.0.Final.jar
io.quarkus.quarkus-resteasy-2.7.5.Final.jar
io.quarkus.quarkus-resteasy-common-2.7.5.Final.jar
io.quarkus.quarkus-resteasy-jackson-2.7.5.Final.jar
io.quarkus.quarkus-resteasy-server-common-2.7.5.Final.jar
org.jboss.resteasy.resteasy-core-4.7.5.Final.jar
org.jboss.resteasy.resteasy-core-spi-4.7.5.Final.jar
org.jboss.resteasy.resteasy-jackson2-provider-4.7.5.Final.jar
org.jboss.resteasy.resteasy-jaxb-provider-4.7.5.Final.jar
org.jboss.resteasy.resteasy-multipart-provider-4.7.5.Final.jar
如果我在我的提供程序中运行我的提供程序:
public class MyProvider implements RealmResourceProvider {
private final Keycloak keycloak;
public MyProvider(KeycloakSession session) {
RealmModel realm = session.getContext().getRealm();
this.keycloak = KeycloakBuilder.builder()
.serverUrl("http://localhost:8080")
.realm(realm.getId())
.grantType(OAuth2Constants.CLIENT_CREDENTIALS)
.clientId("admin-cli")
.clientSecret("...")
.build();
UserResource user = this.keycloak.realm(realm.getId()).users().get("admin");
System.out.println(user);
}
}
我会得到
Uncaught server error: java.lang.ExceptionInInitializerError
然后我意识到也许我也应该添加
org.jboss.resteasy.resteasy-client:4.7.5-Final
。然后我就得到了
Uncaught server error: java.lang.NoClassDefFoundError: org/jboss/resteasy/client/jaxrs/ResteasyClientBuilder
然后我也尝试添加resteasy-client依赖项,所以在添加
org.jboss.resteasy.resteasy-client-api:4.7.5-Final
之后我得到了
Uncaught server error: java.util.ServiceConfigurationError: org.jboss.resteasy.client.jaxrs.spi.ClientConfigProvider: org.wildfly.security.auth.client.spi.RESTEasyClientConfigProviderImpl Unable to get public no-arg constructor
...
Caused by: java.lang.NoClassDefFoundError: org/wildfly/client/config/ConfigXMLParseException
...
Caused by: java.lang.ClassNotFoundException: org.wildfly.client.config.ConfigXMLParseException
然后我意识到
keycloack-admin-client
实际上依赖于resteasy-client
版本3.13.2.Final
而不是4.7.5-Final
。所以我添加了这些版本的 resteasy-client
、resteasy-multipart-provider
、resteasy-jackson2-provider
和 resteasy-jaxb-provider
并得到了
Uncaught server error: java.lang.InstantiationError: org.jboss.resteasy.spi.ResteasyProviderFactory
现在我不知道下一步该尝试什么。
我发现这个问题报告讨论了Keycloak Admin REST客户端和Quarkus之间的Resteasy版本冲突,它提到还有另一个名为
quarkus-keycloack-admin-client
的包。所以我将其添加为依赖项,然后我再次得到:
Uncaught server error: java.lang.NoClassDefFoundError: org/keycloak/admin/client/KeycloakBuilder
还有
quarkus-keycloack-admin-client
依赖于 Keycloak 17,所以我不确定它是否与 18 100% 兼容。
所以我的问题是我应该如何将
keycloack-admin-client
包含在我的提供商中?
我的问题非常相似,我将尝试构建一个定制的quarkus-keycloak-server(https://blog.codecentric.de/2022/05/keycloak-x-aber-sicher-ohne-bekannte-sicherheitsluecken/ )用我自己的扩展所需的依赖项进行扩展。我不知道这是否会导致系统运行,但我希望如此。
我遇到了和你一样的问题,我在这里创建了一个 Keycloak 票证:https://github.com/keycloak/keycloak/issues/11973
我自己通过添加以下内容解决了这个问题:
我用 4.7.5.Final 版本覆盖了
resteasy-client
。
<!--Keycloak-->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--Resteasy-->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<scope>provided</scope>
</dependency>
/providers
文件夹
因为我遇到了如下错误:
未捕获的服务器错误:java.util.ServiceConfigurationError:org.jboss.resteasy.client.jaxrs.spi.ClientConfigProvider:org.wildfly.security.auth.client.spi.RESTEasyClientConfigProviderImpl无法获取公共无参数构造函数
引起:java.lang.ClassNotFoundException:org.wildfly.client.config.ConfigXMLParseException
我找到了该类的依赖项并添加了它,它对我有用:)
<dependency>
<groupId>org.wildfly.client</groupId>
<artifactId>wildfly-client-config</artifactId>
<version>1.0.1.Final</version>
</dependency>
我在 Keycloak 20.0.2 中遇到了同样的问题。
我尝试了很多不起作用的解决方案,最后我通过使用 Maven 配置我的包来完成。 我用
maven-shade-plugin
逐步将我的依赖项包含在 jar 文件中,直到不再出现错误。
请参阅下面我的 pom.xml 文件。
我的版本:
<properties>
<keycloak.version>20.0.2</keycloak.version>
<resteasy.version>4.7.5.Final</resteasy.version>
</properties>
我的依赖:
<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>