This project demonstrates how to dynamically extend a Quarkus-based CLI application at runtime by loading external JARs through a custom classloader. The core idea is to merge an additional classloader — responsible for resolving resources from external Maven artifacts — with the Quarkus application classloader, enabling the application to discover and use classes and resources that were not part of its original build.
The project is structured around two main use cases:
- Greeting command: loads the
dev.snowdrop:modelartifact at runtime, instantiates aMessageclass from it, and renders a localized greeting usingmessages_xx.propertiesresource bundles bundled inside the external JAR. - Rewrite command: loads the
dev.snowdrop:rewriteartifacts including classpath.tsv.gz files, then dynamically invokes a launcher class (OpenRewriteLauncher) to apply OpenRewrite recipes against a target project directory.
This approach is useful when the set of capabilities or domain models needs to be resolved and injected at runtime without recompiling or repackaging the CLI itself.
export JAR_MODEL=$HOME/.m2/repository/dev/snowdrop/model/1.0.0-SNAPSHOT/model-1.0.0-SNAPSHOT.jar
set JAR_MODEL $HOME/.m2/repository/dev/snowdrop/model/1.0.0-SNAPSHOT/model-1.0.0-SNAPSHOT.jar
java -jar ./cli/target/cli-1.0.0-SNAPSHOT-runner.jar \
--jar-path=$JAR_MODEL \
-l en \
quarkusTo debug
set JAR_MODEL $HOME/.m2/repository/dev/snowdrop/model/1.0.0-SNAPSHOT/model-1.0.0-SNAPSHOT.jar
mvn compile -pl cli quarkus:dev \
-Dquarkus.args="--jar-path=$JAR_MODEL -l fr quarkus" -Dsuspendexport JAR_REWRITE=$HOME/.m2/repository/dev/snowdrop/rewrite/1.0.0-SNAPSHOT/rewrite-1.0.0-SNAPSHOT-jar-with-dependencies.jar
set JAR_REWRITE $HOME/.m2/repository/dev/snowdrop/rewrite/1.0.0-SNAPSHOT/rewrite-1.0.0-SNAPSHOT-jar-with-dependencies.jar
java -jar ./cli/target/cli-1.0.0-SNAPSHOT-runner.jar \
--jar $JAR_REWRITE \
--launcher-class dev.snowdrop.launcher.OpenRewriteLauncher \
--project-dir test-project/spring-boot-appTo debug
export JAR_REWRITE=$HOME/.m2/repository/dev/snowdrop/rewrite/1.0.0-SNAPSHOT/rewrite-1.0.0-SNAPSHOT-jar-with-dependencies.jar
set JAR_REWRITE $HOME/.m2/repository/dev/snowdrop/rewrite/1.0.0-SNAPSHOT/rewrite-1.0.0-SNAPSHOT-jar-with-dependencies.jar
mvn compile -pl cli quarkus:dev \
-Dquarkus.args="--jar $JAR_REWRITE --jar $JAR_MODEL --launcher-class dev.snowdrop.launcher.OpenRewriteLauncher --project-dir test-project/spring-boot-app" \
-Dsuspend