diff --git a/core/runtime/src/main/java/io/quarkus/runtime/LaunchMode.java b/core/runtime/src/main/java/io/quarkus/runtime/LaunchMode.java index 22398ad0d5dc24..008270167c6f5e 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/LaunchMode.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/LaunchMode.java @@ -1,5 +1,7 @@ package io.quarkus.runtime; +import io.quarkus.runtime.configuration.ProfileManager; + public enum LaunchMode { /** @@ -29,4 +31,12 @@ public boolean isDevOrTest() { public String getDefaultProfile() { return defaultProfile; } + + /** + * + * @return The current launch mode + */ + public static LaunchMode current() { + return ProfileManager.getLaunchMode(); + } } diff --git a/core/runtime/src/main/java/io/quarkus/runtime/configuration/ProfileManager.java b/core/runtime/src/main/java/io/quarkus/runtime/configuration/ProfileManager.java index 34a6500f64473c..ef365615603d7b 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/configuration/ProfileManager.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/configuration/ProfileManager.java @@ -29,6 +29,10 @@ public static void setLaunchMode(LaunchMode mode) { launchMode = mode; } + public static LaunchMode getLaunchMode() { + return launchMode; + } + public static void setRuntimeDefaultProfile(final String profile) { runtimeDefaultProfile = profile; } diff --git a/docs/src/main/asciidoc/lifecycle.adoc b/docs/src/main/asciidoc/lifecycle.adoc index 3a2651e6b22935..137297ea6780c3 100644 --- a/docs/src/main/asciidoc/lifecycle.adoc +++ b/docs/src/main/asciidoc/lifecycle.adoc @@ -110,3 +110,11 @@ When the application is stopped, the second log message is printed. As usual, the application can be packaged using `./mvnw clean package` and executed using the `-runner.jar` file. You can also generate the native executable using `./mvnw clean package -Pnative`. + +== Luanch Modes + +Quarkus has 3 different launch modes, `NORMAL` (i.e. production), `DEVELOPMENT` and `TEST`. If you are running `quarkus:dev` +then the mode will be `DEVELOPMENT`, if you are running a JUnit test it will be `TEST`, otherwise it will be normal. + +Your application can get the launch mode by injecting the `io.quarkus.runtime.LaunchMode` enum into a CDI bean, +or by invoking the static method `io.quarkus.runtime.LaunchMode.current()`. \ No newline at end of file diff --git a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ArcProcessor.java b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ArcProcessor.java index 483890b4c70c98..ccdecd6f3709da 100644 --- a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ArcProcessor.java +++ b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ArcProcessor.java @@ -40,6 +40,7 @@ import io.quarkus.arc.runtime.AdditionalBean; import io.quarkus.arc.runtime.ArcRecorder; import io.quarkus.arc.runtime.BeanContainer; +import io.quarkus.arc.runtime.LaunchModeProducer; import io.quarkus.arc.runtime.LifecycleEventRunner; import io.quarkus.deployment.Capabilities; import io.quarkus.deployment.annotations.BuildProducer; @@ -328,6 +329,11 @@ void setupExecutor(ExecutorBuildItem executor, ArcRecorder recorder) { recorder.initExecutor(executor.getExecutorProxy()); } + @BuildStep + AdditionalBeanBuildItem launchMode() { + return new AdditionalBeanBuildItem(LaunchModeProducer.class); + } + private abstract static class AbstractCompositeApplicationClassesPredicate implements Predicate { private final IndexView applicationClassesIndex; diff --git a/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/SimpleBeanTest.java b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/SimpleBeanTest.java index e0ee25e2792d0b..f52532f3d87ddf 100644 --- a/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/SimpleBeanTest.java +++ b/extensions/arc/deployment/src/test/java/io/quarkus/arc/test/SimpleBeanTest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import io.quarkus.runtime.LaunchMode; import io.quarkus.test.QuarkusUnitTest; public class SimpleBeanTest { @@ -25,6 +26,9 @@ public class SimpleBeanTest { @Inject SimpleBean simpleBean; + @Inject + LaunchMode launchMode; + @Test public void testSimpleBean() { assertNotNull(simpleBean.getStartupEvent()); @@ -34,4 +38,9 @@ public void testSimpleBean() { assertEquals("1", simpleBean.getBazProvider().get()); } + @Test + public void testLaunchModeInjection() { + assertEquals(LaunchMode.TEST, launchMode); + } + } diff --git a/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/LaunchModeProducer.java b/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/LaunchModeProducer.java new file mode 100644 index 00000000000000..56097f13886ccc --- /dev/null +++ b/extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/LaunchModeProducer.java @@ -0,0 +1,15 @@ +package io.quarkus.arc.runtime; + +import javax.enterprise.context.Dependent; +import javax.enterprise.inject.Produces; + +import io.quarkus.runtime.LaunchMode; + +@Dependent +public class LaunchModeProducer { + + @Produces + LaunchMode mode() { + return LaunchMode.current(); + } +}