javafx - 当 运行 来自构建的自定义运行时图像的应用程序时出现 log4j2 问题

javafx - log4j2 issue when running the app from builded custom runtime image

我创建了多模块 javafx 应用程序,我在其中使用 log4j2 进行日志记录。 构建工具是maven。

我什么时候 运行 它 mvn clean javafx:run 一切都按预期工作 - 没有问题。

但是当我想运行创建运行时候的镜像(用mvn clean compile创建javafx:jlink) 我可以看到日志记录不起作用,并且我在控制台中收到以下错误:

错误 StatusLogger Log4j2 找不到日志记录实现。请将 log4j-core 添加到类路径中。使用SimpleLogger登录控制台...

根据我的搜索,log4j2 似乎是非模块化的问题,解决方案是为 gradle (badass-jlink-plugin.beryx.org) 创建的,不幸的是,我不允许使用 gradle 并且我没有找到与 Maven 类似的东西。但我可能是错的...

有人可以帮忙吗?

这是 pom 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>some.group</groupId>
    <artifactId>artifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>14</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>14</version>
        </dependency>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>jakarta.activation</groupId>
            <artifactId>jakarta.activation-api</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.13.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.3</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.4</version>
                <configuration>
                    <stripDebug>true</stripDebug>
                    <compress>2</compress>
                    <noHeaderFiles>true</noHeaderFiles>
                    <noManPages>true</noManPages>
                    <launcher>myApp</launcher>
                    <jlinkImageName>myApp</jlinkImageName>
                    <jlinkZipName>myApp</jlinkZipName>
                    <mainClass>some.group.artifact.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

这里是模块信息:

module some.group.artifact {
    requires javafx.controls;
    requires javafx.fxml;
    requires transitive javafx.graphics;
    requires javafx.base;
    requires java.xml.bind;
    requires com.sun.xml.bind;
    requires org.apache.logging.log4j;

    opens some.group.artifact.controllers to java.xml.bind, javafx.fxml;
    opens some.group.artifact to javafx.fxml;
    
    exports some.group.artifact.controllers;
    exports some.group.artifact;
}

这是保存在 src/main/resources 文件夹下的 log4j2 属性文件:

status = error
name = Log4j2PropertiesConfig
 
# change log file name as per your requirement
property.filename = ${sys:user.home}/logs
 
appenders = console, rolling
 
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
#appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1}- %msg%n 
appender.console.layout.pattern = %d [%-5level] [%t] %logger{-2} - %msg%n%throwable
 
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}/log.log
appender.rolling.filePattern = ${filename}/history/%d{yyyy-MM-dd-HH-mm-ss}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %p %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.startup.type = OnStartupTriggeringPolicy
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10Mb
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 100
 
loggers = rolling
logger.rolling.name = some.group.artifact
logger.rolling.level = info
logger.rolling.additivity = true
logger.rolling.appenderRef.rolling.ref = RollingFile

rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

感谢您的时间和精力!

我通过切换到 gradle 并使用 badass-jlink-plugin 来修复它。beryx.org ...