moditect / layrry

A Runner and API for Layered Java Applications
Apache License 2.0
332 stars 33 forks source link

Can't launch Micronaut app using multiple layers #105

Open aalmiray opened 3 years ago

aalmiray commented 3 years ago

As reported at https://github.com/micronaut-projects/micronaut-core/issues/5095, a Micronat 2.4.0 demo application can be run with Layrry when a single layer is used

$ larry --layers-config https://raw.githubusercontent.com/aalmiray/micronaut-layrry-demo/main/layers-single.toml --verbose
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:///Users/aalmiray/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/aalmiray/dev/github/layrry/layrry-launcher/target/distributions/layrry-launcher-1.0.0-SNAPSHOT-dist/layrry-launcher-1.0.0-SNAPSHOT/lib/slf4j-simple-1.7.29.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
16:41:22.058 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [cli]
running ...
Hi!

But breaks down when multiple layers are used

$ layrry --layers-config https://raw.githubusercontent.com/aalmiray/micronaut-layrry-demo/main/layers.toml --verbose
Exception in thread "main" java.lang.RuntimeException: Couldn't run module main class
    at org.moditect.layrry.internal.LayersImpl.run(LayersImpl.java:162)
    at org.moditect.layrry.Layrry.launch(Layrry.java:81)
    at org.moditect.layrry.Layrry.run(Layrry.java:36)
    at org.moditect.layrry.launcher.LayrryLauncher.launch(LayrryLauncher.java:102)
    at org.moditect.layrry.launcher.LayrryLauncher.main(LayrryLauncher.java:46)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.moditect.layrry.internal.LayersImpl.run(LayersImpl.java:159)
    ... 4 more
Caused by: java.lang.NoClassDefFoundError: io/micronaut/configuration/picocli/PicocliRunner
    at com.example.demo@0.1/com.example.DemoCommand.main(DemoCommand.java:15)
    ... 9 more
Caused by: java.lang.ClassNotFoundException: io.micronaut.configuration.picocli.PicocliRunner
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/jdk.internal.loader.Loader.loadClass(Loader.java:544)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 10 more

The multi layer configuration file looks like this

[layers.micronaut]
  modules = [
   "ch.qos.logback:logback-classic:1.2.3",
   "ch.qos.logback:logback-core:1.2.3",
   "com.fasterxml.jackson.core:jackson-annotations:2.11.2",
   "com.fasterxml.jackson.core:jackson-core:2.11.2",
   "com.fasterxml.jackson.core:jackson-databind:2.11.2",
   "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.2",
   "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.2",
#   "com.github.spotbugs:spotbugs-annotations:4.0.3",
#   "com.google.code.findbugs:jsr305:3.0.2",
   "info.picocli:picocli:4.6.1",
   "io.micronaut.picocli:micronaut-picocli:3.2.0",
   "io.micronaut:micronaut-aop:2.4.0",
   "io.micronaut:micronaut-context:2.4.0",
   "io.micronaut:micronaut-core-reactive:2.4.0",
   "io.micronaut:micronaut-core:2.4.0",
   "io.micronaut:micronaut-http:2.4.0",
   "io.micronaut:micronaut-inject:2.4.0",
#   "io.micronaut:micronaut-runtime:2.4.0",
   "io.micronaut:micronaut-validation:2.4.0",
   "io.reactivex.rxjava2:rxjava:2.2.10",
   "javax.annotation:javax.annotation-api:1.3.2",
   "javax.inject:javax.inject:1",
   "javax.validation:validation-api:2.0.1.Final",
   "org.reactivestreams:reactive-streams:1.0.3",
   "org.slf4j:slf4j-api:1.7.26",
   "org.yaml:snakeyaml:1.26"]

[layers.app]
  parents = ["micronaut"]
  modules = ["com.example:demo:0.1"]

[main]
  module = "com.example.demo"
  class = "com.example.DemoCommand"

The io.micronaut.configuration.picocli.PicocliRunner class is found in the io.micronaut.picocli:micronaut-picocli:3.2.0 dependency, defined in the micronaut layer, which is a parent of the app layer.