Reputation: 3
I'm trying to run this code from Picocli tutorial: https://micronaut-projects.github.io/micronaut-picocli/latest/guide/#generate
Everything works fine, but the application always run with the "CLI" environment. I need to specify which environment I want..."MOCK" or "PROD", for example.
Similar to Spring that has spring.profiles.active, Micronaut has MICRONAUT_ENVIRONMENTS, but how to instruct this through Picocli?
Thanks!
Upvotes: 0
Views: 511
Reputation: 27245
Similar to Spring that has spring.profiles.active, Micronaut has MICRONAUT_ENVIRONMENTS, but how to instruct this through Picocli?
See the project at github.com/jeffbrown/douglasclienv.
src/main/java/douglasclienv/SomeResolver.java
package douglasclienv;
public interface SomeResolver {
String getDescription();
}
src/main/java/douglasclienv/DefaultResolver.java
package douglasclienv;
import jakarta.inject.Singleton;
@Singleton
public class DefaultResolver implements SomeResolver {
@Override
public String getDescription() {
return "Default Resolver";
}
}
src/main/java/douglasclienv/AlphaResolver.java
package douglasclienv;
import io.micronaut.context.annotation.Requires;
import jakarta.inject.Singleton;
@Singleton
@Requires(env="alpha")
public class AlphaResolver implements SomeResolver {
@Override
public String getDescription() {
return "Alpha Resolver";
}
}
src/main/java/douglasclienv/BetaResolver.java
package douglasclienv;
import io.micronaut.context.annotation.Requires;
import jakarta.inject.Singleton;
@Singleton
@Requires(env="beta")
public class BetaResolver implements SomeResolver {
@Override
public String getDescription() {
return "Beta Resolver";
}
}
src/main/java/douglasclienv/DouglasclienvCommand.java
package douglasclienv;
import io.micronaut.configuration.picocli.PicocliRunner;
import io.micronaut.context.ApplicationContext;
import jakarta.inject.Inject;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;
import java.util.List;
@Command(name = "douglasclienv", description = "...",
mixinStandardHelpOptions = true)
public class DouglasclienvCommand implements Runnable {
@Inject
List<SomeResolver> resolvers;
public static void main(String[] args) throws Exception {
PicocliRunner.run(DouglasclienvCommand.class, args);
}
public void run() {
System.out.println("Resolvers:");
resolvers.stream().forEach(someResolver -> System.out.println("\t"+someResolver.getDescription()));
}
}
That all appears to work as expected.
~ $ mkdir demo
~ $ cd demo
demo $
demo $ git clone [email protected]:jeffbrown/douglasclienv.git
demo $
demo $ cd douglasclienv
douglasclienv (main)$ ./gradlew assemble
douglasclienv (main)$
douglasclienv (main)$ cd build/libs
libs (main)$
libs (main)$
libs (main)$ java -jar douglasclienv-0.1-all.jar
09:18:32.238 [main] INFO i.m.context.env.DefaultEnvironment - Established active environments: [cli]
Resolvers:
Default Resolver
libs (main)$
libs (main)$
libs (main)$ export MICRONAUT_ENVIRONMENTS=alpha
libs (main)$ java -jar douglasclienv-0.1-all.jar
09:18:44.623 [main] INFO i.m.context.env.DefaultEnvironment - Established active environments: [alpha, cli]
Resolvers:
Alpha Resolver
Default Resolver
libs (main)$
libs (main)$
libs (main)$ export MICRONAUT_ENVIRONMENTS=beta
libs (main)$ java -jar douglasclienv-0.1-all.jar
09:18:52.535 [main] INFO i.m.context.env.DefaultEnvironment - Established active environments: [beta, cli]
Resolvers:
Default Resolver
Beta Resolver
libs (main)$
libs (main)$
libs (main)$ export MICRONAUT_ENVIRONMENTS=alpha,beta
libs (main)$ java -jar douglasclienv-0.1-all.jar
09:19:03.881 [main] INFO i.m.context.env.DefaultEnvironment - Established active environments: [alpha, beta, cli]
Resolvers:
Alpha Resolver
Beta Resolver
Default Resolver
EDIT:
Note that if you want to set the environment programatically, you could make your command class look something like this:
package douglasclienv;
import io.micronaut.configuration.picocli.MicronautFactory;
import io.micronaut.context.ApplicationContext;
import jakarta.inject.Inject;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import java.util.List;
import java.util.concurrent.Callable;
@Command(name = "douglasclienv", description = "...",
mixinStandardHelpOptions = true)
public class DouglasclienvCommand implements Callable<Object> {
@Inject
List<SomeResolver> resolvers;
public static void main(String[] args) {
try (ApplicationContext context = ApplicationContext.builder().environments("beta").start()) {
new CommandLine(DouglasclienvCommand.class, new MicronautFactory(context)).
setCaseInsensitiveEnumValuesAllowed(true).
setUsageHelpAutoWidth(true).
execute(args);
}
}
@Override
public Object call() throws Exception {
System.out.println("Resolvers:");
resolvers.stream().forEach(someResolver -> System.out.println("\t" + someResolver.getDescription()));
return null;
}
}
Upvotes: 0