官方说明:Logging in Native Image (graalvm.org)
我使用graalvm-community-jdk-21.0.1_windows-x64_bin.zip,解压后配置好JAVA_HOME和PATH,安装 C++,就可以直接使用,不需要复杂的匹配过程
日志这一块卡了很长时间,最后的方法是在application.yml中启用日志
然后编译时,会自动根据XML中的内容去判断反射的类,生成相关的引用信息,不需要自己在编译参数中增加内容
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
<buildArgs>
--no-fallback
<!-- --initialize-at-build-time=io.netty-->
<!-- --initialize-at-run-time=org.apache.logging.log4j.spi.Provider-->
<!-- --initialize-at-build-time=ch.qos.logback-->
<!-- --initialize-at-build-time=org.springframework.util.unit.DataSize-->
<!-- --initialize-at-build-time=org.slf4j.MDC-->
<!-- --initialize-at-build-time=ch.qos.logback.classic.Level-->
<!-- --initialize-at-build-time=ch.qos.logback.classic.Logger-->
<!-- --initialize-at-build-time=ch.qos.logback.core.util.StatusPrinter-->
<!-- --initialize-at-build-time=ch.qos.logback.core.status.StatusBase-->
<!-- --initialize-at-build-time=ch.qos.logback.core.status.InfoStatus-->
<!-- --initialize-at-build-time=ch.qos.logback.core.spi.AppenderAttachableImpl-->
<!-- --initialize-at-build-time=org.slf4j.LoggerFactory-->
<!-- --initialize-at-build-time=ch.qos.logback.core.util.Loader-->
<!-- --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder-->
<!-- --initialize-at-build-time=ch.qos.logback.classic.spi.ThrowableProxy-->
<!-- --initialize-at-build-time=ch.qos.logback.core.CoreConstants-->
--report-unsupported-elements-at-runtime
--allow-incomplete-classpath
-H:+ReportExceptionStackTraces
</buildArgs>
</configuration>
</plugin>
@@#
这种方法得到的EXE,logback已经提前编译并匹配好了,可以直接使用,如果还想在启动时指定新的XML,或者修改其中的内容,以及定时scan,可以增加代码,为logback配置一个绝对地址,在spring启动后强行重新配置LOGBACK
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
if (!reloaded.get()) {
loggerContext.reset();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
String workPath = nettyProperties.workPath; //AOT下使用绝对路径,使autoload可用
configurator.doConfigure(Paths.get(workPath, "config/logback-spring.xml").toFile());
log.warn("重新加载日志配置{}", nettyProperties.workPath);
reloaded.set(true);
}
@@#