在 Wildfly jar 中包含第三方库(keycloak SPI)

Alv*_*aro 3 java jar gradle wildfly keycloak

我正在使用服务提供商接口为 keycloak 创建插件(提供商)。我已经能够建立一对了。现在我需要添加smallrye-graphql-client 库来查询graphql 服务器。但是,当我部署插件时,在类路径中找不到该库。

\n

问题

\n
    \n
  1. 是否仍然可以创建一个包含依赖库的 jar?
  2. \n
  3. 如果1不可能的话,可以通过战争来完成吗?
  4. \n
  5. 如何将库添加到类路径中。最好将它们与插件一起添加,而不是静态地添加到 Wildfly。我正在使用 gradle。更多详细信息如下。
  6. \n
\n

背景信息

\n

我成功地为其创建了一个类和集成测试。但是,当我将插件部署到 keycloak 时,出现以下错误:

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

我已将 gradle 配置为包含导致问题的依赖项,并将其添加到类路径中。我怀疑我应该在 jboss-deployment-struct.xml 中添加一个条目,但我不知道应该在那里写什么。

\n

等级配置

\n
plugins {\n    id 'war'\n    id 'java-library'\n    id 'maven-publish'\n}\nrepositories {\n    mavenLocal()\n    mavenCentral()\n    jcenter()\n}\nconfigurations {\n    dependenciesToInclude\n}\ndependencies {\n    dependenciesToInclude "io.smallrye:smallrye-graphql-client:1.0.20"\n\n\n    providedCompile group: 'javax.enterprise', name: 'cdi-api', version: '2.0'\n    providedCompile "org.keycloak:keycloak-server-spi:${keycloakVersion}"\n    providedCompile "org.keycloak:keycloak-server-spi-private:${keycloakVersion}"\n    providedCompile("org.keycloak:keycloak-services:${keycloakVersion}") {\n        exclude group: 'org.slf4j', module: 'slf4j-api'\n        exclude group: 'org.slf4j', module: 'slf4j-log4j12'\n    }\n    providedCompile group: 'org.keycloak', name: 'keycloak-model-api', version: '1.8.1.Final'\n    providedCompile "org.jboss.resteasy:resteasy-jaxrs"\n\n    providedCompile group: 'org.eclipse.microprofile.graphql', name: 'microprofile-graphql-api', version: '1.0.3'\n    compile group: 'org.apache.geronimo.config', name: 'geronimo-config-impl', version: '1.2.2'\n    configurations.compile.extendsFrom(configurations.dependenciesToInclude)\n}\n\n\njar {\n    manifest {\n        attributes(\n                "Class-Path": configurations.dependenciesToInclude.collect { it.getName() }.join(' '))\n    }\n    from {\n        configurations.dependenciesToInclude.collect { it.isDirectory() ? it : zipTree(it) }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\xe2\x9d\xaf cat META-INF/MANIFEST.MF                                                                                                                                                                                                     \xe2\x94\x80\xe2\x95\xaf\nManifest-Version: 1.0\nClass-Path: smallrye-graphql-client-1.0.20.jar geronimo-config-impl-1.2.\n 2.jar smallrye-graphql-client-api-1.0.20.jar microprofile-graphql-api-1\n .0.3.jar microprofile-config-api-1.3.jar org.osgi.annotation.versioning\n -1.0.0.jar\n
Run Code Online (Sandbox Code Playgroud)\n

下面是 jboss-deployment-struct.xml。在那里你可以看到我尝试包含 graphql 库(已注释掉)

\n
<jboss-deployment-structure>\n    <deployment>\n        <dependencies>\n            <module name="org.keycloak.keycloak-services"/>\n            <module name="org.keycloak.keycloak-saml-core-public"/>\n            <module name="org.apache.commons.codec"/>\n            <module name="org.apache.commons.lang"/>\n            <module name="org.jboss.logging"/>\n            <!--            <module name="io.smallrye.smallrye-graphql-client"/>-->\n        </dependencies>\n    </deployment>\n</jboss-deployment-structure>\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用 Keycloak 11.0.2 (WildFly Core 12.0.3.Final)

\n

Mar*_*ška 6

我不确定我是否正确理解将库静态添加到 jboss 的部分。我会根据我对您问题的理解来回答。\n您的问题有多种解决方案。

\n

Jboss依赖

\n

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

\n

模块放置在 JBoss 的主文件夹中。模块是在运行时不会更改的库。\n每个模块都有名为module.xml的描述符文件,您可以在其中定义模块的工件、依赖项和名称。\n文件 module.xml 基本上类似于您的 jboss-deployment - 模块世界中的struction.xml。

\n

部署被放置在部署文件夹中,并且可以在 JBoss 服务器运行时重新部署。如果部署需要依赖于另一个模块/部署,则需要将其包含在给定部署的 jboss-deployment-struct 中。\nNote that modules cannot be dependent on deployments but it works the other way around

\n

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

\n

解决方案 1 - JBoss 模块

\n

如果您想获取对 JBoss 中模块的依赖关系,您需要在 module.xml 中找到它的名称并将其写入您的 jboss-deployment-struct.xml (假设您的库是一个部署)

\n

例如,如果您想要 keycloak 模块路径中的 jackson-dataformat-cbor-2.10.5.jar 依赖项:

\n
modules/system/layers/keycloak/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/main/jackson-dataformat-cbor-2.10.5.jar\n
Run Code Online (Sandbox Code Playgroud)\n

在同一文件夹中有一个 module.xml,其内容为:

\n
modules/system/layers/keycloak/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/main/jackson-dataformat-cbor-2.10.5.jar\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着您的模块的名称是com.fasterxml.jackson.dataformat.jackson-dataformat-cbor,这就是您作为依赖项放入 jboss-deployment-struct.xml 中的名称。

\n

你的情况

\n

smallrye-graphql-client在您的情况下,您需要对JBoss 模块中未包含的依赖项。这意味着您必须将其添加到那里。\n通过在层中创建文件夹来创建 JBoss 层:\n modules/system/layers/[name of your layer]\n执行此操作后,您还应该将您的层包含在modules/layers.conf. 您可以通过在 keycloak 层后写入逗号来包含它,如下所示:

\n
layers=keycloak,[your layer]\n
Run Code Online (Sandbox Code Playgroud)\n

创建后,您可以将插件添加到层中,例如如下所示:\nmodules/system/layers/[name of your layer]/org/my/plugins/main

\n

文件夹内部将是:

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

那么您要做的唯一一件事就是将此模块作为依赖项包含在您的 jboss-deployment-struct.xml 中。(您始终包含模块的名称)

\n

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

\n

如果您不喜欢手动创建这些东西,您可以创建 jboss-modules-builder,例如这个。它将使用 maven 创建模块 xml:

\n

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

\n

解决方案 2 - Fat JAR/WAR

\n

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

\n\n

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

\n