I'm using logback the default logging system with graal native image and I'm using this repo under native-image/spring-boot-microservice-jibber.
What I changed:
1) pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring</name>
<properties>
<spring-cloud.version>2023.0.0</spring-cloud.version>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-wiremock</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.rednoise</groupId>
<artifactId>rita</artifactId>
<version>2.4.501</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<buildArgs combine.children="append">
<arg>-Ob</arg>
<arg>--initialize-at-run-time=com.fasterxml.jackson.databind.*,com.fasterxml.jackson.core.*,org.apache.logging.slf4j.*</arg>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
2) in the main package HintConfiguration + logback.xml + applycation.yaml
@Configuration
@ImportRuntimeHints(HintConfiguration.InnerHintRegistar.class)
public class HintConfiguration {
public static class InnerHintRegistar implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints runtimeHints, ClassLoader classLoader) {
runtimeHints.resources().registerPattern("logback.xml");
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- Optional: define a few common properties -->
<property name="LOG_DATEFORMAT_PATTERN" value="yyyy-MM-dd HH:mm:ss.SSS"/>
<property name="LOG_LEVEL_PATTERN" value="%5p"/>
<property name="LOG_FILE_FORMAT"
value="%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} [%t][%c{1}:%L]: %m%n"/>
<!-- Console appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_FILE_FORMAT}</pattern>
</encoder>
</appender>
<!-- Root logger -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
spring:
application:
name: test
cloud:
config:
fail-fast: false
profile: int1-test
discovery:
enabled: false
config:
import: "optional:configserver:http://localhost:8888?label=master"
3) in the test package:
package com.example.benchmarks.jibber;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.test.web.reactive.server.WebTestClient;
import com.github.tomakehurst.wiremock.client.WireMock;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
@RouteTest
public class CiaoTest {
@Test
void contextLoads() {}
}
@SpringBootTest
public class DemoApplicationTest {
@Test
void contextLoads() {
}
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@SpringBootTest
@AutoConfigureWebTestClient(timeout = "30000")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@AutoConfigureWireMock(port = 9900)
@DisabledInNativeImage
public @interface RouteTest {
}
package com.example.benchmarks.jibber;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class DemoApplicationTest {
@Test
void contextLoads() {
}
}
Error:
Caused by: java.nio.file.FileAlreadyExistsException: /Users/paolopiccinini/development/graalvm-demos/native-image/spring-boot-microservice-jibber/target/spring-aot/test/resources/META-INF/spring/logback-model
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:94)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:261)
at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:482)
at java.base/java.nio.file.Files.newOutputStream(Files.java:228)
at java.base/java.nio.file.Files.copy(Files.java:3153)
at org.springframework.aot.generate.FileSystemGeneratedFiles.addFile(FileSystemGeneratedFiles.java:93)
if I use @SpringBootTest instead of @RouteTest the test will work, if I remove spring-cloud-config-starter tests will work and if I change filename lombok.xml -> notImportant.xml test will work.
Command to reproduce mvn clean -PnativeTest test.
Can someone help me understand what is the problem? spring boot should work with lombok or lombok-spring.xml
Comment From: snicoll
OSS Support for Spring Boot 3.2 has ended. If you want support please upgrade first to Spring Boot 3.5 and provide a minimal sample that we can run (not the current snippets in text). You can attach a zip file with the project here or share a link that we can use to clone the project locally.