在 Quarkus 中登录在开发模式下工作,但在 JVM docker 图像中不输出

Logging in Quarkus works in dev mode, but doesn't output in JVM docker image

在构建 Quarkus 应用程序时,我 运行 遇到以下问题:包含要扩展的基础应用程序会导致在 JVM 模式下登录时出现问题。当 运行 在通过 Quarkus maven 插件可用的开发模式下运行时,我能够在控制台中看到日志并正常使用该应用程序。当我使用 JVM(或我的 Dockerfile 远程 运行 插件)时,日志不显示在控制台中。

我尝试过在配置中添加显式设置以启用日志记录,您可以在下面的分支中看到,我确保包正确存在,甚至复制了它以缩小原因范围到我编写的基础应用程序,这只会影响来自 Maven 外部的 jar 运行。

有谁知道是什么导致了这种奇怪的行为?我已将一些案例推送到我重现问题的公开可用应用程序,以及有关如何重现问题的步骤。

示例好案例:
https://github.com/autumnfound/git-eca-rest-api/tree/malowe/master/known-good

JVM 中没有日志的示例:
https://github.com/autumnfound/git-eca-rest-api/tree/malowe/master/log-repro

导致日志记录问题的代码(特别是核心库似乎是问题子项):
https://gitlab.eclipse.org/eclipsefdn/webdev/eclipsefdn-api-common

在控制台中向 运行 命令重现案例:

mvn compile quarkus:dev
mvn clean compile package  
java -jar target/git-eca-0.0.1-runner.jar

从 POM 中摘录以导入导致问题的Jar/lib

    <repositories>
        <repository>
            <id>eclipsefdn</id>
            <url>https://repo.eclipse.org/content/repositories/eclipsefdn/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.eclipsefoundation</groupId>
                <artifactId>quarkus-commons</artifactId>
                <version>0.1-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.eclipsefoundation</groupId>
            <artifactId>quarkus-core</artifactId>
            <version>0.1-SNAPSHOT</version>
        </dependency>
        ...

如有任何帮助,我们将不胜感激!

此问题是由某些 class 加载冲突引起的。如果你 运行 jar 处于调试模式:

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y -jar target/git-eca-0.0.1-runner.jar

并将远程调试器连接到它,当它试图为 META-INF/services/org.jboss.logging.LoggerProvider 寻找服务实现时,您可以观察到 java ServiceLoader 解析中的问题。执行此操作的 JarLoader 期望在 /lib 文件夹中找到名称为 artifactId.jar 的 jar,而 quarkus maven 构建将它们作为 group.artifactId.jar 存储在 lib 文件夹中,因此资源加载失败(没有任何日志,导致记录器甚至无法配置)。 根本原因是你的 quarkus-core 有一个 t运行sitive compile scoped dep to jboss-logmanager.

您可以通过排除有问题的 t运行sitive 依赖项来轻松测试修复:

<dependency>
    <groupId>org.eclipsefoundation</groupId>
    <artifactId>quarkus-core</artifactId>
    <version>${eclipse-api-version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.jboss.logmanager</groupId>
            <artifactId>jboss-logmanager</artifactId>
        </exclusion>
    </exclusions>
</dependency>

如果您从 quarkus-core 模块的 pom 中删除 jboss-logmanager 依赖项,那么它将起作用。