Я создаю плагины (поставщики) для keycloak, используя интерфейс поставщика услуг. Я смог построить пару. Теперь мне нужно добавить библиотеку smallrye-graphql-client для запросов к серверу graphql. Однако библиотека не найдена в пути к классам, когда я развертываю плагин.
Мне удалось создать для него класс и интеграционный тест. Однако, когда я развертываю плагин для 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)
Не уверен, что правильно понимаю кусок с добавлением библиотеки статически в 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
Вы можете найти гораздо больше информации в Интернете, но это основная информация, которую вы можете использовать.
Если вы хотите получить зависимость от модуля в 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
Внутри папки будет:
Тогда вам остается только включить этот модуль в файл 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
В основном, если вам нужно простое решение, вы можете добавить библиотеку в свой JAR/WAR напрямую, используя плагины maven/Gradle.
Я не рекомендую использовать решения Fat JAR/WAR, так как при добавлении большего количества плагинов вы можете потеряться в зависимостях и получить такие ошибки, как случаи дублирования классов зависимостей.
вам нужно добавить файл 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
.
Спасибо, @marcel, что нашли время написать такой развернутый ответ. Я, наконец, пошел по ушной дорожке. В основном потому, что я нашел примеры специально для Keycloak в github, которые решали ту же проблему. github.com/dteleguin/beercloak github.com/zak905/keycloak-api-key-demo keycloak.discourse.group/t/…