search:

Quarkus native image app 만들 때 tip

28 Nov 2021

Quarkus를 이용하여 native image app을 만들던 에러가 발생했다.

구글링해보면 금방 찾을 수 있는 내용이지만 정리 겸 블로그에 남겨본다.

좀더 자세한 내용은 Quarkus 공식 문서인 TIPS FOR WRITING NATIVE APPLICATIONS에서 볼 수 있다.

resource file을 native image에 포함시키기.

src/main/resources/a.txt라는 파일은 다음과 같은 Java code로 읽을 수 있다.

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("a.txt");

그런데 native image로 빌드 후 실행해보면 ‘파일을 못찾는다’는 에러가 발생한다. 이유는 GraalVM은 기본적으로 resources file들을 native image에 포함하지 않기 때문이다.

해결 방법은 src/main/resources/application.properties 파일에 아래의 내용을 추가하면 된다.

quarkus.native.resources.includes=**

위 설정은 Quarkus의 설정이고, 내부적으로는 GraalVM 문서의 Accessing Resources in Native Images에 나온 것을 대신해줄 것 같다.

Registering for reflection

이건 한글 제목이 마땅히 생각나지 않아서 Quarkus의 제목을 그대로 가져왔다.

GraalVM은 native image를 생성할 때 사용되지 않는 code는 제거한다.

따라서 Jackson ObjectMapper를 사용하는 경우 다음과 같은 에러 메시지를 보게 된다.

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.acme.jsonb.Person and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

이때는 class에 @RegisterForReflection annotation을 추가해주면 된다.

이것도 Quarkus에서 추가된 annotation이다.

GraalVM 문서의 Reflection Use in Native Images를 자동으로 해주는 Quarkus의 annotation이라 생각된다.