Включить стороннюю библиотеку в банку wildfly (keycloak SPI)

Я создаю плагины (поставщики) для keycloak, используя интерфейс поставщика услуг. Я смог построить пару. Теперь мне нужно добавить библиотеку smallrye-graphql-client для запросов к серверу graphql. Однако библиотека не найдена в пути к классам, когда я развертываю плагин.

Вопросы

  1. Можно ли создать банку, включающую библиотеку зависимостей?
  2. Если 1 невозможно, можно ли это сделать с помощью войны?
  3. Как я могу добавить библиотеку в путь к классам. Желательно, чтобы они добавлялись вместе с плагином, а не статически в Wildfly. Я использую град. Подробнее ниже.

Справочная информация

Мне удалось создать для него класс и интеграционный тест. Однако, когда я развертываю плагин для keycloak, я получаю следующую ошибку:

16:38:38,127 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-1) 
             Uncaught server error: java.util.ServiceConfigurationError: no 
             io.smallrye.graphql.client.typesafe.api.GraphQlClientBuilder in classpath

Я настроил gradle, чтобы включить зависимость, вызвавшую проблему, а также добавить ее в путь к классам. Я подозреваю, что я должен добавить запись в jboss-deployment-structure.xml, но я не знаю, что я должен написать там.

Конфигурация градиента

plugins {
    id 'war'
    id 'java-library'
    id 'maven-publish'
}
repositories {
    mavenLocal()
    mavenCentral()
    jcenter()
}
configurations {
    dependenciesToInclude
}
dependencies {
    dependenciesToInclude "io.smallrye:smallrye-graphql-client:1.0.20"


    providedCompile group: 'javax.enterprise', name: 'cdi-api', version: '2.0'
    providedCompile "org.keycloak:keycloak-server-spi:${keycloakVersion}"
    providedCompile "org.keycloak:keycloak-server-spi-private:${keycloakVersion}"
    providedCompile("org.keycloak:keycloak-services:${keycloakVersion}") {
        exclude group: 'org.slf4j', module: 'slf4j-api'
        exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }
    providedCompile group: 'org.keycloak', name: 'keycloak-model-api', version: '1.8.1.Final'
    providedCompile "org.jboss.resteasy:resteasy-jaxrs"

    providedCompile group: 'org.eclipse.microprofile.graphql', name: 'microprofile-graphql-api', version: '1.0.3'
    compile group: 'org.apache.geronimo.config', name: 'geronimo-config-impl', version: '1.2.2'
    configurations.compile.extendsFrom(configurations.dependenciesToInclude)
}


jar {
    manifest {
        attributes(
                "Class-Path": configurations.dependenciesToInclude.collect { it.getName() }.join(' '))
    }
    from {
        configurations.dependenciesToInclude.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
❯ cat META-INF/MANIFEST.MF                                                                                                                                                                                                     ─╯
Manifest-Version: 1.0
Class-Path: smallrye-graphql-client-1.0.20.jar geronimo-config-impl-1.2.
 2.jar smallrye-graphql-client-api-1.0.20.jar microprofile-graphql-api-1
 .0.3.jar microprofile-config-api-1.3.jar org.osgi.annotation.versioning
 -1.0.0.jar

Ниже приведен файл jboss-deployment-structure.xml. Там вы можете увидеть мою попытку включить библиотеку graphql (закомментировано)

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name = "org.keycloak.keycloak-services"/>
            <module name = "org.keycloak.keycloak-saml-core-public"/>
            <module name = "org.apache.commons.codec"/>
            <module name = "org.apache.commons.lang"/>
            <module name = "org.jboss.logging"/>
            <!--            <module name = "io.smallrye.smallrye-graphql-client"/>-->
        </dependencies>
    </deployment>
</jboss-deployment-structure>

Я использую Keycloak 11.0.2 (WildFly Core 12.0.3.Final)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
3 252
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не уверен, что правильно понимаю кусок с добавлением библиотеки статически в jboss. Я отвечу, исходя из того, что я понимаю в вашей проблеме. Есть несколько решений вашей проблемы.

JBoss-зависимости

Сначала вы должны понять, как JBoss разрешает свои классы и зависимости. Я объясню очень просто. JBoss разделен на модули и развертывания.

Модули помещаются в домашнюю папку вашего JBoss. Модули — это библиотеки, которые вы не будете изменять во время выполнения. Каждый модуль имеет файл дескриптора с именем module.xml, в котором вы определяете свои артефакты, зависимости и имя модуля. Файл module.xml в основном похож на ваш jboss-deployment-structure.xml в мире модулей.

Развертывания помещаются в папку развертываний и могут быть повторно развернуты во время работы сервера JBoss. Если для развертывания требуется зависимость от другого модуля/развертывания, его необходимо включить в структуру jboss-deployment данного развертывания. Note that modules cannot be dependent on deployments but it works the other way around

Вы можете найти гораздо больше информации в Интернете, но это основная информация, которую вы можете использовать.

Решение 1 — модули JBoss

Если вы хотите получить зависимость от модуля в JBoss, вам нужно найти его имя в module.xml и записать его в свой jboss-deployment-structure.xml (при условии, что ваша библиотека является развертыванием)

Так, например, если вам нужна зависимость от jackson-dataformat-cbor-2.10.5.jar в пути модулей keycloak:

modules/system/layers/keycloak/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/main/jackson-dataformat-cbor-2.10.5.jar

В этой же папке находится module.xml с содержимым:

<?xml version = "1.0" encoding = "UTF-8"?>
<!--
  ~ Copyright 2019 Red Hat, Inc. and/or its affiliates
  ~ and other contributors as indicated by the @author tags.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<module name = "com.fasterxml.jackson.dataformat.jackson-dataformat-cbor" xmlns = "urn:jboss:module:1.3">
    <resources>
        <resource-root path = "jackson-dataformat-cbor-2.10.5.jar"/>
    </resources>

    <dependencies>
        <module name = "com.fasterxml.jackson.core.jackson-core"/>
        <module name = "com.fasterxml.jackson.core.jackson-databind"/>
        <module name = "com.fasterxml.jackson.core.jackson-annotations"/>
    </dependencies>
</module>

это означает, что имя вашего модуля — com.fasterxml.jackson.dataformat.jackson-dataformat-cbor, и это то, что вы поместили в свой jboss-deployment-structure.xml в качестве зависимости.

Ваш случай

В вашем случае вам нужна зависимость от smallrye-graphql-client, которая не включена в модули JBoss. Это означает, что вам придется добавить его туда. Создайте слой JBoss, создав папку в слоях: modules/system/layers/[name of your layer] После этого вы также должны включить свой слой в modules/layers.conf. Вы включаете его, написав запятую после слоя keycloak следующим образом:

layers=keycloak,[your layer]

После того, как вы его создали, вы можете добавить в свой слой свои плагины, например, так: modules/system/layers/[name of your layer]/org/my/plugins/main

Внутри папки будет:

  • Ваша банка
  • module.xml (создайте его в соответствии с другими модулями)

Тогда вам остается только включить этот модуль в файл jboss-deployment-structure.xml в качестве зависимости. (Вы всегда включаете имя модуля)

Note that you might have to add more libraries as dependencies to your modules. You can include all of it in the modules

Если вам не нравится создавать этот материал вручную, вы можете создать jboss-modules-builder, такой как этот. Он создаст ваши модули xml с помощью maven:

https://github.com/marcel-ouska/jboss-modules-builder

Решение 2 — Fat JAR/WAR

В основном, если вам нужно простое решение, вы можете добавить библиотеку в свой JAR/WAR напрямую, используя плагины maven/Gradle.

Я не рекомендую использовать решения Fat JAR/WAR, так как при добавлении большего количества плагинов вы можете потеряться в зависимостях и получить такие ошибки, как случаи дублирования классов зависимостей.

Спасибо, @marcel, что нашли время написать такой развернутый ответ. Я, наконец, пошел по ушной дорожке. В основном потому, что я нашел примеры специально для Keycloak в github, которые решали ту же проблему. github.com/dteleguin/beercloak github.com/zak905/keycloak-api-key-demo keycloak.discourse.group/t/…

Alvaro 05.01.2021 08:12

вам нужно добавить файл jboss-deployment-structure.xml в каталог src/main/resources/META-INF

<jboss-deployment-structure>
<deployment>
    <dependencies>
        <module name = "com.microsoft" />
    </dependencies>
</deployment>
</jboss-deployment-structure>

и он должен вызвать настоящий модуль в каталоге сервера keycloak modules.

Другие вопросы по теме