Search code examples
grailsmicronautgrails-4

Grails 4: Micronaut fails with NoClassDefFoundError: javax/annotation/PreDestroy


I migrated a Grails 3.3.10 application to Grails 4.0.0, moving from Java 8 to OpenJDK 11. After some work to make the tests and application run on my development environment ( a windows 10 machine ), I packaged my executable war in a docker adoptopenjdk/openjdk11:alpine. The docker's entrypoint just runs the app:

java <some options> -jar /app/application.war

The docker when run however gives an error when initializing Micronaut:

java.util.ServiceConfigurationError: Error loading service [org.grails.databinding.converters.$DefaultConvertersConfigurationDefinitionClass]: javax/annotation/PreDestroy

at io.micronaut.core.io.service.DefaultServiceDefinition.lambda$load$0(DefaultServiceDefinition.java:71)

...

Caused by: java.lang.NoClassDefFoundError: javax/annotation/PreDestroy

...

Caused by: java.lang.ClassNotFoundException: javax.annotation.PreDestroy

I tried to add compile 'javax.annotation:javax.annotation-api:1.3.2' in my gradle dependencies, without success.

What's missing to make my application run?


Solution

  • Java 11 no longer ships with some of the javax libraries.

    Following the instruction from https://blog.codefx.org/java/java-11-migration-guide/#Migrating-From-Java-8-To-Java-11 solved the issue.