首页 > 解决方案 > 使用 org.keycloak.authentication.authenticators.broker.util 中的类时提供程序 jar 中的 NoClassDefFoundError

问题描述

我正在为 keycloak 编写 Authenticator 提供程序,我将其打包为.jar. 一旦它使用来自 keycloak-services 的类,我就会得到一个NoClassDefFoundError. 当通过“ mvn wildfly:deploy”部署提供程序时,我得到了同样的错误。

我一定是遗漏了一些东西,但我很少编写 java 代码,此时我一无所知。

我在 pom.xml 中定义了依赖项,并尝试了“提供”和“编译”作为范围:

    <dependencies>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-core</artifactId>
            <scope>provided</scope>
            <version>${keycloak.version}</version>
        </dependency>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-server-spi</artifactId>
            <scope>provided</scope>
            <version>${keycloak.version}</version>
        </dependency>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-server-spi-private</artifactId>
            <scope>provided</scope>
            <version>${keycloak.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <scope>provided</scope>
            <version>3.1.4.GA</version>
        </dependency>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-services</artifactId>
            <scope>provided</scope>
            <version>${keycloak.version}</version>
        </dependency>
    </dependencies>

将以下代码添加到身份验证函数后,我会立即收到错误消息:

    AuthenticationSessionModel authSession = context.getAuthenticationSession();
    SerializedBrokeredIdentityContext serializedCtx =
        SerializedBrokeredIdentityContext.readFromAuthenticationSession(
            authSession, "BROKERED_CONTEXT");

我得到的错误:

20:05:03,844 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-6) Uncaught server error: java.lang.NoClassDefFoundError: org/keycloak/authentication/authenticators/broker/util/SerializedBrokeredIdentityContext

标签: javajarkeycloak

解决方案


因为 wildfly 隔离了类加载器,所以我必须在 META-INF/MANIFEST.MF 文件中声明依赖项。

为此,我将以下代码添加到我的 pom.xml 文件中:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Dependencies>org.keycloak.keycloak-services</Dependencies>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

(解决方案是在keycloak用户列表上给我的:https ://lists.jboss.org/pipermail/keycloak-user/2019-September/019108.html )


推荐阅读