Douglas
Douglas

Reputation: 3

How to execute a JAR file from MICRONAUT application, through PICOCLI, with a different environment

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

Answers (1)

Jeff Scott Brown
Jeff Scott Brown

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

Related Questions