On Mon, 26 Jan 2026 08:36:39 GMT, Christian Stein <[email protected]> wrote:

>> Please review this change to make `jar --validate` check an automatic module 
>> name given in a manifest file, via the `Automatic-Module-Name` attribute.
>> 
>> Prior to this commit, a `MANFEST.MF` reading
>> 
>> Automatic-Module-Name: default
>> 
>> added into a JAR file named `a.jar` would not fail when passed to `jar 
>> --validate --file a.jar`. However, it does fail when the JAR file is put on 
>> the module path of the Java launcher. For example:
>> 
>> $ java --module-path a.jar --describe-module default
>> 
>> Error occurred during initialization of boot layer
>> java.lang.module.FindException: Unable to derive module descriptor for a.jar
>> Caused by: java.lang.module.FindException: Automatic-Module-Name: default: 
>> Invalid module name: 'default' is not a Java identifier
>> 
>> 
>> With this change applied, `jar --validate --file a.jar` will print an error 
>> message and return a non-zero exit value:
>> 
>> 
>> invalid module name of Automatic-Module-Name entry in manifest: default
>> 
>> 
>> The new check also fails for when the module name of a compiled module 
>> descriptor differs from the value given in the manifest file of the same JAR 
>> file.
>
> Christian Stein has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   Address review comments

src/jdk.jartool/share/classes/sun/tools/jar/Validator.java line 105:

> 103:         this.zis = zis;
> 104:         checkModuleDescriptor(MODULE_INFO);
> 105:         checkAutomaticModuleName();

The separate method is much better. I don't think doing this in the constructor 
is great though. I suggest moving this, and the existing call to 
`checkModuleDescriptor` to the `validate` method, then the constructor is for 
instantiation only, and the validate method handles the validate logic. (but, 
that's more of a personal preference)

src/jdk.jartool/share/classes/sun/tools/jar/Validator.java line 480:

> 478:                 
> errorAndInvalid(formatMsg("error.validator.manifest.invalid.automatic.module.name",
>  automaticModuleName));
> 479:             }
> 480:             if (md == null || automaticModuleName.equals(md.name())) {

Realizing this now, but this is only checking the top-level 
`module-info.class`, not any of the ones under the `META-INF/versions` 
directories. e.g. `checkModuleDescriptor` is also being called for each 
versioned `module-info.class` file. Is that something that we should also be 
doing for this check?

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/29316#discussion_r2728711130
PR Review Comment: https://git.openjdk.org/jdk/pull/29316#discussion_r2728741939

Reply via email to