-
Bug
-
Resolution: Fixed
-
P3
-
9
-
b140
This can be reproduce with steps below
1. just create a simple jar with following classes:
class A in unnamed package
class B in package p
2. package into a jar file, such as test.jar
3. try with
JDK_HOME/bin/jdeps --gen-module-info ./ test.jar
Exception in thread "main" java.lang.module.FindException: Unable to derive module descriptor for: test.jar
at java.lang.module.ModulePath.readJar(java.base@9-ea/ModulePath.java:552)
at java.lang.module.ModulePath.readModule(java.base@9-ea/ModulePath.java:274)
at java.lang.module.ModulePath.scan(java.base@9-ea/ModulePath.java:193)
at java.lang.module.ModulePath.scanNextEntry(java.base@9-ea/ModulePath.java:145)
at java.lang.module.ModulePath.findAll(java.base@9-ea/ModulePath.java:121)
at com.sun.tools.jdeps.ModuleInfoBuilder.<init>(jdk.jdeps@9-ea/ModuleInfoBuilder.java:80)
at com.sun.tools.jdeps.JdepsTask.genModuleInfo(jdk.jdeps@9-ea/JdepsTask.java:653)
at com.sun.tools.jdeps.JdepsTask.run(jdk.jdeps@9-ea/JdepsTask.java:506)
at com.sun.tools.jdeps.JdepsTask.run(jdk.jdeps@9-ea/JdepsTask.java:470)
at com.sun.tools.jdeps.Main.main(jdk.jdeps@9-ea/Main.java:48)
Caused by: java.lang.IllegalArgumentException: Empty package name
at jdk.internal.module.Checks.requireJavaIdentifier(java.base@9-ea/Checks.java:70)
at jdk.internal.module.Checks.requirePackageName(java.base@9-ea/Checks.java:93)
at java.lang.module.ModuleDescriptor$Exports.<init>(java.base@9-ea/ModuleDescriptor.java:269)
at java.lang.module.ModuleDescriptor$Exports.<init>(java.base@9-ea/ModuleDescriptor.java:266)
at java.lang.module.ModuleDescriptor$Exports.<init>(java.base@9-ea/ModuleDescriptor.java:239)
at java.lang.module.ModuleDescriptor$Builder.exports(java.base@9-ea/ModuleDescriptor.java:1347)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(java.base@9-ea/ForEachOps.java:184)
at java.util.stream.DistinctOps$1$2.accept(java.base@9-ea/DistinctOps.java:175)
at java.util.stream.ReferencePipeline$3$1.accept(java.base@9-ea/ReferencePipeline.java:195)
at java.util.HashMap$KeySpliterator.forEachRemaining(java.base@9-ea/HashMap.java:1600)
at java.util.stream.AbstractPipeline.copyInto(java.base@9-ea/AbstractPipeline.java:484)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@9-ea/AbstractPipeline.java:474)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(java.base@9-ea/ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(java.base@9-ea/ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(java.base@9-ea/AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(java.base@9-ea/ReferencePipeline.java:430)
at java.lang.module.ModulePath.deriveModuleDescriptor(java.base@9-ea/ModulePath.java:436)
at java.lang.module.ModulePath.readJar(java.base@9-ea/ModulePath.java:548)
... 9 more
Apparently, jdeps restricts all classes should be in named package, but I really doubt if such restriction is necessary. Users may write test or module private classes in unnamed module. This should be ignored during generating module info rather than interrupting the procedure.
1. just create a simple jar with following classes:
class A in unnamed package
class B in package p
2. package into a jar file, such as test.jar
3. try with
JDK_HOME/bin/jdeps --gen-module-info ./ test.jar
Exception in thread "main" java.lang.module.FindException: Unable to derive module descriptor for: test.jar
at java.lang.module.ModulePath.readJar(java.base@9-ea/ModulePath.java:552)
at java.lang.module.ModulePath.readModule(java.base@9-ea/ModulePath.java:274)
at java.lang.module.ModulePath.scan(java.base@9-ea/ModulePath.java:193)
at java.lang.module.ModulePath.scanNextEntry(java.base@9-ea/ModulePath.java:145)
at java.lang.module.ModulePath.findAll(java.base@9-ea/ModulePath.java:121)
at com.sun.tools.jdeps.ModuleInfoBuilder.<init>(jdk.jdeps@9-ea/ModuleInfoBuilder.java:80)
at com.sun.tools.jdeps.JdepsTask.genModuleInfo(jdk.jdeps@9-ea/JdepsTask.java:653)
at com.sun.tools.jdeps.JdepsTask.run(jdk.jdeps@9-ea/JdepsTask.java:506)
at com.sun.tools.jdeps.JdepsTask.run(jdk.jdeps@9-ea/JdepsTask.java:470)
at com.sun.tools.jdeps.Main.main(jdk.jdeps@9-ea/Main.java:48)
Caused by: java.lang.IllegalArgumentException: Empty package name
at jdk.internal.module.Checks.requireJavaIdentifier(java.base@9-ea/Checks.java:70)
at jdk.internal.module.Checks.requirePackageName(java.base@9-ea/Checks.java:93)
at java.lang.module.ModuleDescriptor$Exports.<init>(java.base@9-ea/ModuleDescriptor.java:269)
at java.lang.module.ModuleDescriptor$Exports.<init>(java.base@9-ea/ModuleDescriptor.java:266)
at java.lang.module.ModuleDescriptor$Exports.<init>(java.base@9-ea/ModuleDescriptor.java:239)
at java.lang.module.ModuleDescriptor$Builder.exports(java.base@9-ea/ModuleDescriptor.java:1347)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(java.base@9-ea/ForEachOps.java:184)
at java.util.stream.DistinctOps$1$2.accept(java.base@9-ea/DistinctOps.java:175)
at java.util.stream.ReferencePipeline$3$1.accept(java.base@9-ea/ReferencePipeline.java:195)
at java.util.HashMap$KeySpliterator.forEachRemaining(java.base@9-ea/HashMap.java:1600)
at java.util.stream.AbstractPipeline.copyInto(java.base@9-ea/AbstractPipeline.java:484)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@9-ea/AbstractPipeline.java:474)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(java.base@9-ea/ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(java.base@9-ea/ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(java.base@9-ea/AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(java.base@9-ea/ReferencePipeline.java:430)
at java.lang.module.ModulePath.deriveModuleDescriptor(java.base@9-ea/ModulePath.java:436)
at java.lang.module.ModulePath.readJar(java.base@9-ea/ModulePath.java:548)
... 9 more
Apparently, jdeps restricts all classes should be in named package, but I really doubt if such restriction is necessary. Users may write test or module private classes in unnamed module. This should be ignored during generating module info rather than interrupting the procedure.