当前位置: 首页 > 知识库问答 >
问题:

在野蝇罐中包含第三方库(keyCloak SPI)

白彦
2023-03-14

我正在创建插件(提供商)使用服务提供商接口的keyCloak。我已经能够建立一对夫妇。现在,我需要添加Smallrye-Graphql客户端库来查询Graphql服务器。但是,部署插件时,在类路径中找不到库。

  1. 是否仍然可以创建一个包含依赖库的jar?
  2. 如果1不可能,可以用战争来完成吗?
  3. 如何将库添加到类路径。优选地,那些是与插件一起添加的,而不是静态地添加到Wildfly中。我正在使用gradle。下面是更多的细节。

我成功地为它创建了一个类和集成测试。然而,当我将插件部署到KeyClope时,我发现了以下错误:

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部署结构中添加一个条目。xml,但我不知道应该在那里写什么。

gradle配置

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部署结构。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.最终)

共有1个答案

荀裕
2023-03-14

我不确定我是否正确理解了将库静态添加到jboss的过程。我会根据我对你问题的理解来回答。你的问题有多种解决方案。

您应该首先了解JBoss如何解析其类和依赖项。我将非常简单地解释。JBoss分为模块和部署。

模块放在JBoss的主文件夹中。模块是在运行时不会更改的库。每个模块都有一个名为module的描述符文件。定义构件、依赖项和模块名称的xml。文件模块。xml基本上类似于jboss部署结构。模块世界中的xml。

部署被放在Deployments文件夹中,可以在JBoss服务器运行时重新部署。如果部署需要依赖于另一个模块/部署,则需要将其包含在给定部署的jboss部署结构中<代码>请注意,模块不能依赖于部署,但它可以反过来工作

你可以在互联网上找到更多的信息,但这是你可以使用的基本信息。

如果你想获得对JBoss中某个模块的依赖,你需要在module中找到它的名字。xml并将其写入jboss部署结构。xml(假设您的库是一个部署)

例如,如果你想依赖jackson-dataformat-cbor-2.10.5。keydepeat模块路径中的jar:

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 cbor,这就是您在jboss部署结构中的内容。xml作为一种依赖关系。

在你的例子中,你需要一个JBoss模块中没有包含的对的依赖。这意味着你必须把它加在那里。通过在层中创建一个文件夹来创建JBoss层:模块/系统/层/[层的名称]这样做后,你还应该在模块/layers.conf中包含你的层。您可以通过在键斗篷层后面写逗号来包含它,就像这样:

layers=keycloak,[your layer]

创建之后,您可以向层中添加插件,例如:modules/system/layers/[name of your layer]/org/my/plugins/main

文件夹的内部将是:

  • 你的罐子
  • module.xml(根据其他模块创建)

然后你唯一要做的就是将这个模块作为依赖项包含在你的jboss-deployment-structure.xml中。(您总是包含模块的名称)

注意,您可能需要添加更多的库作为模块的依赖项。您可以将其全部包含在模块中

如果你不想手动创建这些东西,你可以创建像这样的jboss模块生成器。它将使用maven创建您的模块xml:

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

基本上,如果你想要一个简单的解决方案,你可以直接使用maven/Gradle插件将库添加到你的JAR/WAR中。

  • 脂肪罐-http://tutorials.jenkov.com/maven/maven-build-fat-jar.html
  • 战争-你的依赖自动打包

我不建议使用Fat JAR/WAR解决方案,因为添加更多插件可能会在依赖关系中丢失,并出现错误,例如重复依赖类的情况。

 类似资料:
  • 我是Hadoop的新手。我已将Gson API添加到我的Map减少程序中。当我运行程序获取时; 有谁能建议我如何向Hadoop添加第三方库吗?

  • 问题内容: 如何在Google App Engine中添加Google不提供的第三方python库?我正在尝试在Google App Engine中使用BeautifulSoup,但无法这样做。但是我的问题是我想在Google App Engine中使用的任何库。 问题答案: 为了手动包括任何其他库,你必须将它们放在其中的目录中app.yaml。因此,例如,如果你具有以下结构: 然后hello.p

  • 问题内容: 我想使用jQuery和其他不是React本身的第三方库。如何在我的React项目中使用它们?我读到的是调用第三方库的好地方。 不幸的是,即使我已经正确地将脚本标记链接到index.html文件中的那些库,但由于不断收到“未定义”错误,所以我无法使用这些库。 问题答案: 您有两个选择,均由一个人为设计的示例演示,其中我使用jQuery淡出了无序列表。两种方法都各有利弊,我先强调两种方法,

  • 本文向大家介绍在SAPUI5项目中包括第三方库,包括了在SAPUI5项目中包括第三方库的使用技巧和注意事项,需要的朋友参考一下

  • 我想从詹金斯那里向wildfly部署一个war文件。我尝试了很多方法,但都不管用 我使用了将WAR/EAR部署到wildfly插件,但它对我不起作用,我得到了错误: (致命:无法初始化命令上下文。生成步骤“将WAR/EAR部署到WildFly”将生成标记为失败已完成:失败), 我搜索了那个问题,但给出的答案对我没有帮助。 在我使用将WAR/EAR部署到容器的构建后操作中,它对我也不起作用,我得到了

  • 我有一个web应用程序部署为使用Wildfly的爆炸战争。我想要得到的是 null 目前,我所处的情况是,我可以选择其中一个或另一个,但不能同时获得这两个选项(这意味着,要么每个jsp更改都强制进行新的部署,要么.class文件不强制进行新的部署)。 wildfly的当前配置(使用版本8.1.0)为 此外,我还发现,无论我在deployment-scanner配置中设置了什么,一旦服务器启动并运行