Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Annotation processor gives FATAL ERROR: picocli.CommandLine$InitializationException: ArgGroup has no options or positional parameters, and no subgroups #794

Closed
remkop opened this issue Aug 25, 2019 · 9 comments
Milestone

Comments

@remkop
Copy link
Owner

remkop commented Aug 25, 2019

(Related to #793) The annotation processor occasionally gives this error for composite groups:

FATAL ERROR: picocli.CommandLine$InitializationException: ArgGroup has no options or positional parameters, and no subgroups

This is not easy to reproduce but may happen when building from Gradle or when an arg group is used as both a field and as a parameter in a @Command-annotated method.

The cause is likely that the annotation processor depends on the javac compiler to present @ArgGroup-annotated elements in topologically sorted order (so the groups with no dependencies on other groups come first, and groups that depend on other groups come later).

When this assumption is broken, the above error may occur if a composite arg group is built before its subgroups are built.

The solution is for the annotation processor to do its own topological sorting and not depend on javac.

@remkop remkop added this to the 4.0.3 milestone Aug 25, 2019
remkop added a commit that referenced this issue Aug 25, 2019
…cting the model

To prevent FATAL ERROR: picocli.CommandLine$InitializationException: ArgGroup has no options or positional parameters, and no subgroups
remkop added a commit that referenced this issue Aug 26, 2019
To prevent FATAL ERROR: picocli.CommandLine$InitializationException: ArgGroup has no options or positional parameters, and no subgroups
@remkop remkop closed this as completed in a6e849c Aug 26, 2019
@antonmry
Copy link

This is hitting me when launching picocli 4.2.0 from IntelliJ Idea, even with Annotation Processor enabled. It works well compiling and launch it from the terminal.

Error:java: FATAL ERROR: picocli.CommandLine$InitializationException: ArgGroup has no options or positional parameters, and no subgroups: null AnnotatedElementHolder(FIELD configGroup in KtmSanityCheck)
  	at picocli.CommandLine$Model$ArgGroupSpec.<init>(CommandLine.java:8655)
  	at picocli.CommandLine$Model$ArgGroupSpec$Builder.build(CommandLine.java:9082)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor$Context.connectArgGroups(AbstractCommandSpecProcessor.java:954)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor$Context.connectModel(AbstractCommandSpecProcessor.java:832)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor$Context.access$000(AbstractCommandSpecProcessor.java:783)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor.tryProcess(AbstractCommandSpecProcessor.java:185)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor.process(AbstractCommandSpecProcessor.java:156)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:802)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:713)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1043)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1184)
  	at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
  	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
  	at com.sun.tools.javac.main.Main.compile(Main.java:523)
  	at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
  	at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
  	at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:207)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.compileJava(JavaBuilder.java:486)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.compile(JavaBuilder.java:338)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.doBuild(JavaBuilder.java:263)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.build(JavaBuilder.java:216)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1328)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:1006)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:1073)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:967)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:796)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:378)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:178)
  	at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:140)
  	at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:297)
  	at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:130)
  	at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler.lambda$channelRead0$0(BuildMain.java:232)
  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  	at java.lang.Thread.run(Thread.java:748)

@remkop
Copy link
Owner Author

remkop commented Apr 21, 2020

Recently I occasionally encounter this in intelli/j. I’ve been able to resolve it by specifying a different JDK than the one that’s built-in to Intelli/J.

Are you using Intelli/J? (Sorry, I was reading this on my phone and missed your first sentence...)

@antonmry
Copy link

antonmry commented Apr 21, 2020

Yes, using IntelliJ Idea 2019.3 with a separate JDK 1.8.0_141. The error happens when we add a second subcommand with Annotation Processors enabled.

EDIT: no problem, thanks for the prompt response

@remkop
Copy link
Owner Author

remkop commented Apr 21, 2020

Ok, that is interesting. Can you provide your command(s) so I can try to reproduce it?

@antonmry
Copy link

It's a quite big application, these are the relevant parts:

KtmCli.java:

@Command(name = "ktm-cli", description = "xxx",
    version = KtmCli.PROJECT_VERSION, subcommands = {KtmTopic.class, KtmSanityCheck.class}
)
@Slf4j
public class KtmCli {
}

KtmTopic.java:

@Command(name = "topic", description = "yyyy",
    mixinStandardHelpOptions = true, exitCodeListHeading = "Exit Codes:%n",
    exitCodeList = {EXIT_SUCCESS + ": successful program execution",
        EXIT_ERROR_CONFIG_CLIENT + ": error in config client",
        EXIT_ERROR_CONFIG_TOPIC + ": error in config topic", EXIT_ERROR_GENERIC + ": error in execution time"})
@Slf4j
public class KtmTopic implements Callable<Integer> {

    @ArgGroup(exclusive = ActionGroup.EXCLUSIVE, multiplicity = "0..1", heading = "\n" + ActionGroup.GROUP_KEY + ":\n")
    private ActionGroup actionGroup;

    @ArgGroup(exclusive = ConfigGroup.EXCLUSIVE, multiplicity = "0..1", heading = "\n" + ConfigGroup.GROUP_KEY + ":\n")
    private ConfigGroup configGroup;

    @ArgGroup(exclusive = LogGroup.EXCLUSIVE, multiplicity = "0..1", heading = "\n" + LogGroup.GROUP_KEY + ":\n")
    private LogGroup logGroup;

    @ArgGroup(exclusive = TopicGroup.EXCLUSIVE, multiplicity = "1", heading = "\n" + TopicGroup.GROUP_KEY + ":\n")
    private TopicGroup topicGroup;

KtmSanityCheck.java:

@Command(name = "sanity", description = "zzzzz",
        mixinStandardHelpOptions = true, exitCodeListHeading = "Exit Codes:%n",
        exitCodeList = {EXIT_SUCCESS + ": successful program execution",
                EXIT_ERROR_CONFIG_CLIENT + ": error in config client"})
@Slf4j
public class KtmSanityCheck implements Callable<Integer> {

    @ArgGroup(exclusive = ConfigGroup.EXCLUSIVE, multiplicity = "0..1", heading = "\n" + ConfigGroup.GROUP_KEY + ":\n")
    private ConfigGroup configGroup;

    @ArgGroup(exclusive = LogGroup.EXCLUSIVE, multiplicity = "0..1", heading = "\n" + LogGroup.GROUP_KEY + ":\n")
    private LogGroup logGroup;

@hatyo
Copy link

hatyo commented Jul 29, 2020

I am consistently hitting this issue in IntelliJ. I have a (root)command and a bunch of subcommands separated in different files, one of these subcommands contains two ArgGroups.

Interestingly, if I modify something the Java file of the root command and try to rebuild, I consistently get this error:

Error:java: FATAL ERROR: picocli.CommandLine$InitializationException: ArgGroup has no options or positional parameters, and no subgroups: AnnotatedElementHolder(FIELD tableNameGroup in a.b.c.RowCommand) in null
  	at picocli.CommandLine$Model$ArgGroupSpec.<init>(CommandLine.java:9449)
  	at picocli.CommandLine$Model$ArgGroupSpec$Builder.build(CommandLine.java:9893)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor$Context.connectArgGroups(AbstractCommandSpecProcessor.java:954)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor$Context.connectModel(AbstractCommandSpecProcessor.java:832)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor$Context.access$000(AbstractCommandSpecProcessor.java:783)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor.tryProcess(AbstractCommandSpecProcessor.java:185)
  	at picocli.codegen.annotation.processing.AbstractCommandSpecProcessor.process(AbstractCommandSpecProcessor.java:156)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
  	at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
  	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
  	at com.sun.tools.javac.main.Main.compile(Main.java:523)
  	at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
  	at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
  	at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:207)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.compileJava(JavaBuilder.java:486)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.compile(JavaBuilder.java:338)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.doBuild(JavaBuilder.java:263)
  	at org.jetbrains.jps.incremental.java.JavaBuilder.build(JavaBuilder.java:216)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1328)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:1006)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:1073)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:967)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:796)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:378)
  	at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:178)
  	at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:140)
  	at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:297)
  	at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:130)
  	at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler.lambda$channelRead0$0(BuildMain.java:232)
  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  	at java.lang.Thread.run(Thread.java:748)

However, if I then modify anything in the Java file of the subcommand with the two ArgGroups, it compiles correctly.

IntelliJ version: 2019.3.5
JDK: 1.8.0.251
picocli version: 4.4.0

@remkop
Copy link
Owner Author

remkop commented Jul 29, 2020

@hatyo I still occasionally see this error when a project is incrementally compiled in Intelli/J.
When I do Rebuild Project in intelli/J the project compiles correctly without any error.
(I don't remember if this particular project has the picocli-codegen annotation processor configured.)

Is this your experience too?

It may be an issue of intelli/J's incremental compilation and may not be a problem in picocli.
However, if you can share a way for me to reproduce the problem I will try to investigate.

@remkop
Copy link
Owner Author

remkop commented Jul 31, 2020

@hatyo I was able to reproduce the error.
Since this ticket is closed, I created a new one #1138 to investigate.

@remkop
Copy link
Owner Author

remkop commented Aug 2, 2020

Picocli 4.5 has been released, which includes this fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants