在 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
依赖项,那么它将起作用。
在构建 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
依赖项,那么它将起作用。