如何配置maven使用logback编译原生镜像?
这是我的环境:
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<imageName>output</imageName>
<mainClass>ir.moke.ni.MainClass</mainClass>
<buildArgs>
<buildArgs>--initialize-at-build-time=ch.qos.logback,org.slf4j</buildArgs>
<buildArgs>-H:ReflectionConfigurationFiles=src/main/resources/META-INF/reflection-config.json</buildArgs>
<buildArg>-H:IncludeResources=logback.xml</buildArg>
<buildArg>-H:+UnlockExperimentalVMOptions</buildArg>
<buildArg>-H:Log=registerResource:5</buildArg>
<buildArg>--initialize-at-build-time=ch.qos.logback,org.slf4j</buildArg>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
logback.xml:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="ir.moke" level="debug" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<root level="error">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
reflection-config.json:
[
{
"name": "ch.qos.logback.classic.pattern.DateConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.MessageConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.ThrowableProxyConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.NopThrowableInformationConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.ContextNameConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BoldYellowCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.LoggerConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.ReplacingCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BoldBlueCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.CyanCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.RedCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.WhiteCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.PropertyConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.RootCauseFirstThrowableProxyConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.MethodOfCallerConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.LevelConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.IdentityCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BoldWhiteCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.MarkerConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BoldCyanCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BoldMagentaCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.RelativeTimeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.MagentaCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.ClassOfCallerConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.LineOfCallerConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.FileOfCallerConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BoldGreenCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.LocalSequenceNumberConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.YellowCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.GrayCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.MDCConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.ClassOfCallerConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BoldRedCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.GreenCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.core.pattern.color.BlackCompositeConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.ThreadConverter",
"allDeclaredConstructors": true
},
{
"name": "ch.qos.logback.classic.pattern.LineSeparatorConverter",
"allDeclaredConstructors": true
}
]
我的简单主课:
package ir.moke.ni;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MainClass {
private static final Logger logger = LoggerFactory.getLogger(MainClass.class);
static {
System.out.println("Application started");
}
public static void main(String[] args) {
logger.info("This is INFO log");
logger.warn("This is WARN log");
logger.debug("This is DEBUG log");
logger.error("This is ERROR log");
logger.trace("This is TRACE log");
}
}
这是目录树:
logback-project/
├── pom.xml
└── src
└── main
├── java
│ └── ir
│ └── moke
│ └── ni
│ └── MainClass.java
└── resources
├── logback.xml
└── META-INF
└── reflection-config.json
项目生成原生图像没有任何问题,但日志不起作用!
如何解决这个问题?
注意:我尝试制作一系列有关原生图像的教育项目,但我无法解决这个问题! 教程项目存储库
更新:
有趣的是,我以编程方式实现了 logback(没有 logback.xml),这个项目确实可以正常工作。
按如下方式更新构建时初始化:-
--initialize-at-build-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService,org.slf4j.MDC,ch.qos.logback.core.pattern.parser.Parser,ch.qos.logback.core.util.Loader,ch.qos.logback.core.util.StatusPrinter,org.slf4j.impl.StaticLoggerBinder,org.slf4j.LoggerFactory,ch.qos.logback.classic.Logger,ch.qos.logback.core.spi.AppenderAttachableImpl,ch.qos.logback.core.status.StatusBase,ch.qos.logback.classic.Level,ch.qos.logback.core.status.InfoStatus,ch.qos.logback.classic.PatternLayout,ch.qos.logback.core.CoreConstants