Keycloak Custom SPI Развертывание с внешним Jar - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть реализация SPI:

  • Пользовательский SPI, напрямую реализованный через интерфейс SPI
  • имеет внешний jar, которого нет в базе JBoss

1) Развертывание EAR: я попытался развернуть EAR и развернуть .ear в / standalone / deployments. Это решает проблему с внешним jar, которая входит в папку lib EAR. Но теперь SPI не инициализируется (что я видел при отладке), а также я получаю исключение при запуске SPI:

11:34:02,185 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: Keycloak 9.0.2 (WildFly Core 10.0.3.Final) started in 12070ms - Started 732 of 1031 services (613 services are lazy, passive or on-demand)
11:34:18,209 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-1) Uncaught server error: java.lang.NullPointerException
        at org.keycloak.keycloak-services@9.0.2//org.keycloak.services.DefaultKeycloakSessionFactory.getAllProviderIds(DefaultKeycloakSessionFactory.java:362)

Тогда я подумал, что, возможно, keycloak не может импортировать расширенный SPI через автономный / развертывание развертывания, которое также упоминается здесь , если вы разрабатываете собственный SPI keycloak, предлагает (или требует?) развертывание модуля.

2) Затем я попробовал развертывание модуля; Теперь я вижу, что мой пользовательский SPI инициализируется, но теперь Keycloak не может найти мой внешний JAR.

13:17:05,682 FATAL [org.keycloak.services] (ServerService Thread Pool -- 65) java.lang.RuntimeException: org.jboss.modules.ModuleNotFoundException: com.orbitz.consul

В качестве решения я нашел где-то, что я могу поместить свой зависимый jar и все его зависимые jar в $ {KEYCLOAK_HOME} \ modules \ system \ layer \ keycloak , но я не надену не хочу устанавливать мой внешний JAR и все его зависимости вручную на базу keycloak (может быть, автоматически как-нибудь?). Любое решение?

Скрипт для развертывания в виде модуля:

./jboss-cli.bat --command="module add --name=de.easy.one.bouncer.spi.registry --resources=target/registry-spi-1.0.1-SNAPSHOT.jar --dependencies=org.keycloak.keycloak-core,org.keycloak.keycloak-services,org.keycloak.keycloak-server-spi,org.keycloak.keycloak-server-spi-private,javax.api,javax.ws.rs.api,com.fasterxml.jackson.core.jackson-core,com.fasterxml.jackson.core.jackson-databind,com.fasterxml.jackson.core.jackson-annotations,org.jboss.logging,com.orbitz.consul"

И добавил его в автономный. xml следующим образом:

<provider>module:de.easy.one.bouncer.spi.registry</provider>

META-INF / услуги


имя файла -> содержимое файла

org.keycloak.provider.Spi -> de.easy.one.bouncer.spi.registry.spi.RegistryProviderSpi

de.easy.one.bouncer. spi.registry.spi.RegistryProviderFactory -> de.easy.one.bouncer.spi.registry.consul.ConsulRegistryProviderFactory


мой пом. xml

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-server-spi</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-server-spi-private</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-services</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- this is not provided and I want to use as external jar -->
    <dependency>
        <groupId>com.orbitz.consul</groupId>
        <artifactId>consul-client</artifactId>
        <version>1.4.2</version>
    </dependency>
</dependencies>
...