Having an required option:
@Option(longName = "meta-file", required = true)
Produces different behavior between two modes:
- Interactive mode handles it ok
$>parse
Unable to run command parse: Required option '--meta-file' is missing.
- Non-interactive mode ends up in exception:
$ ./cli parse
2026-04-22T14:53:36.362+02:00 INFO 74329 --- [cli] [ main] .s.b.a.l.ConditionEvaluationReportLogger :
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2026-04-22T14:53:36.380+02:00 ERROR 74329 --- [cli] [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.shell.core.command.CommandExecutionException: Unable to execute command parse
at org.springframework.shell.core.command.CommandExecutor.execute(CommandExecutor.java:74) ~[spring-shell-core-4.0.1.jar!/:4.0.1]
at org.springframework.shell.core.NonInteractiveShellRunner.executeCommand(NonInteractiveShellRunner.java:156) ~[spring-shell-core-4.0.1.jar!/:4.0.1]
at org.springframework.shell.core.NonInteractiveShellRunner.run(NonInteractiveShellRunner.java:94) ~[spring-shell-core-4.0.1.jar!/:4.0.1]
at org.springframework.shell.core.autoconfigure.ShellRunnerAutoConfiguration.lambda$springShellApplicationRunner$0(ShellRunnerAutoConfiguration.java:39) ~[spring-shell-core-autoconfigure-4.0.1.jar!/:4.0.1]
at org.springframework.boot.SpringApplication.lambda$callRunner$0(SpringApplication.java:788) ~[spring-boot-4.0.5.jar!/:4.0.5]
at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:82) ~[spring-core-7.0.6.jar!/:7.0.6]
at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60) ~[spring-core-7.0.6.jar!/:7.0.6]
at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:86) ~[spring-core-7.0.6.jar!/:7.0.6]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) ~[spring-boot-4.0.5.jar!/:4.0.5]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:788) ~[spring-boot-4.0.5.jar!/:4.0.5]
at org.springframework.boot.SpringApplication.lambda$callRunners$0(SpringApplication.java:776) ~[spring-boot-4.0.5.jar!/:4.0.5]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:186) ~[na:na]
at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:571) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:632) ~[na:na]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776) ~[spring-boot-4.0.5.jar!/:4.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:328) ~[spring-boot-4.0.5.jar!/:4.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1365) ~[spring-boot-4.0.5.jar!/:4.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-4.0.5.jar!/:4.0.5]
at com.plainlyvideos.psdcli.PsdCliApplication.main(PsdCliApplication.java:18) ~[!/:0.24.0]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na]
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:106) ~[plainly-psd-cli-0.24.0.jar:0.24.0]
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) ~[plainly-psd-cli-0.24.0.jar:0.24.0]
at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40) ~[plainly-psd-cli-0.24.0.jar:0.24.0]
Caused by: java.lang.IllegalArgumentException: Required option '--meta-file' is missing.
at org.springframework.shell.core.command.adapter.MethodInvokerCommandAdapter.prepareArguments(MethodInvokerCommandAdapter.java:156) ~[spring-shell-core-4.0.1.jar!/:4.0.1]
at org.springframework.shell.core.command.adapter.MethodInvokerCommandAdapter.doExecute(MethodInvokerCommandAdapter.java:92) ~[spring-shell-core-4.0.1.jar!/:4.0.1]
at org.springframework.shell.core.command.AbstractCommand.execute(AbstractCommand.java:162) ~[spring-shell-core-4.0.1.jar!/:4.0.1]
at org.springframework.shell.core.command.CommandExecutor.execute(CommandExecutor.java:71) ~[spring-shell-core-4.0.1.jar!/:4.0.1]
... 28 common frames omitted
Registering explicit ExitStatusExceptionMapper that targets that IllegalArgumentException does not work.
Having an required option:
Produces different behavior between two modes:
Registering explicit
ExitStatusExceptionMapperthat targets thatIllegalArgumentExceptiondoes not work.