remkop / picocli

Picocli is a modern framework for building powerful, user-friendly, GraalVM-enabled command line apps with ease. It supports colors, autocompletion, subcommands, and more. In 1 source file so apps can include as source & avoid adding a dependency. Written in Java, usable from Groovy, Kotlin, Scala, etc.
https://picocli.info
Apache License 2.0
4.89k stars 422 forks source link

NullPointerException upon moving to 4.7.6 from 4.7.5 #2291

Closed JessHolle closed 1 month ago

JessHolle commented 4 months ago

I am getting a NullPointerException apparently from within picocli code when attempting to upgrade to 4.7.6 from 4.7.5 (where the app works AOK).

I get

NullPointerException: Cannot invoke "java.lang.ClassLoader.getResource(String)" because the return value of "java.lang.Class.getClassLoader()" is null while processing argument at or before arg[2] 'foo' in [dumpSchema, -o, foo]: java.lang.NullPointerException: Cannot invoke "java.lang.ClassLoader.getResource(String)" because the return value of "java.lang.Class.getClassLoader()" is null

The related annotations are:

  @CommandLine.Command(name = "dumpSchema", separator = " ", description="...",
                       mixinStandardHelpOptions = true, versionProvider = Main.VersionProvider.class,
                       defaultValueProvider = PropertiesDefaultProvider.class)
  // used from main() via picocli annotations
  private static void dumpSchema(
    @CommandLine.Option(names = "-o", paramLabel="<outputFile>", required = false,
                        description = "...")
    @Nullable Path outputFile)

Setting -Dpicocli.trace, I get loads of INFO messages along these lines. All without any further stack traces or the like, unfortunately.

With 4.7.5 I get no such messages.

In case it matters this is for an application wrapped up as a single jar and being invoked via java -jar (and built via the com.github.johnrengelman.shadow Gradle plugin).

remkop commented 4 months ago

Thank you for raising this. Class.getClassLoader() returning null is puzzling, to say the least, but the fact that you don't see this with picocli 4.7.5 suggests that it is related to a recent change.

This may be difficult to investigate without a way to reproduce the issue. Is your application in a public repo somewhere?

remkop commented 4 months ago

I think I found the cause: The change in https://github.com/remkop/picocli/pull/2107 (PropertiesDefaultProvider improvement) is missing some defensive coding.