Issue with an automatic module

charbel yazbeck charbel_yazbeck at hotmail.com
Mon Aug 1 15:37:34 UTC 2016


Hi


i was trying to play around latest jigsaw version in order to adapt an open source projet that i developed and i found the following issue.

When using a jar containing a class with no package, the modulefinder is failing to create its module descriptor.

It guesses that it is an automatic module (unamed), but fails with the following stack trace :


Exception in thread "main" java.lang.module.FindException: Unable to derive module descriptor for: D:\.m2\com\github\maven-nar\nar-maven-plugin\3.0.0\nar-maven-plugin-3.0.0.jar
    at java.lang.module.ModulePath.readJar(java.base at 9-ea/ModulePath.java:538)
    at java.lang.module.ModulePath.readModule(java.base at 9-ea/ModulePath.java:273)
    at java.lang.module.ModulePath.scan(java.base at 9-ea/ModulePath.java:192)
    at java.lang.module.ModulePath.scanNextEntry(java.base at 9-ea/ModulePath.java:144)
    at java.lang.module.ModulePath.findAll(java.base at 9-ea/ModulePath.java:120)
    at test.Test.main(Test.java:46)
Caused by: java.lang.IllegalArgumentException: Empty package name
    at jdk.internal.module.Checks.requireJavaIdentifier(java.base at 9-ea/Checks.java:70)
    at jdk.internal.module.Checks.requirePackageName(java.base at 9-ea/Checks.java:93)
    at java.lang.module.ModuleDescriptor$Exports.<init>(java.base at 9-ea/ModuleDescriptor.java:269)
    at java.lang.module.ModuleDescriptor$Exports.<init>(java.base at 9-ea/ModuleDescriptor.java:266)
    at java.lang.module.ModuleDescriptor$Exports.<init>(java.base at 9-ea/ModuleDescriptor.java:239)
    at java.lang.module.ModuleDescriptor$Builder.exports(java.base at 9-ea/ModuleDescriptor.java:1347)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(java.base at 9-ea/ForEachOps.java:184)
    at java.util.stream.DistinctOps$1$2.accept(java.base at 9-ea/DistinctOps.java:175)
    at java.util.stream.ReferencePipeline$3$1.accept(java.base at 9-ea/ReferencePipeline.java:195)
    at java.util.HashMap$KeySpliterator.forEachRemaining(java.base at 9-ea/HashMap.java:1600)
    at java.util.stream.AbstractPipeline.copyInto(java.base at 9-ea/AbstractPipeline.java:484)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base at 9-ea/AbstractPipeline.java:474)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(java.base at 9-ea/ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(java.base at 9-ea/ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(java.base at 9-ea/AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(java.base at 9-ea/ReferencePipeline.java:430)
    at java.lang.module.ModulePath.deriveModuleDescriptor(java.base at 9-ea/ModulePath.java:435)
    at java.lang.module.ModulePath.readJar(java.base at 9-ea/ModulePath.java:534)
    ... 5 more



when looking in the class ModulePath, in the method deriveModuleDescriptor, the problem seems to come from the following code


// all packages are exported
        classFiles.stream()
            .map(c -> toPackageName(c))
            .distinct()
            .forEach(builder::exports);



when the class has no package, toPackageName returns "", and builder::exports throws an exception.

Easy fix could be to assert in the forEach before calling builder::exports



Thank you





More information about the jigsaw-dev mailing list