The latest web revs.  Answers to questions in-line below:

http://cr.openjdk.java.net/~sdrach/8153654/webrev.10/ 
<http://cr.openjdk.java.net/~sdrach/8153654/webrev.10/>

http://cr.openjdk.java.net/~sdrach/8153654/webrev.jdk/ 
<http://cr.openjdk.java.net/~sdrach/8153654/webrev.jdk/>

>>> 
>>> This looks quite good.  JDK-8163798 and JDK-8164665 will define public APIs 
>>> to get the versioned entries and real name which I think are useful for 
>>> tools.  It’s fine to proceed with this change and update jdeps to use the 
>>> public APIs when available.
>> 
>> The product team has decided not to move forward on those two issues for 
>> now, they will remain unresolved.
> 
> OK.  What about putting these helper methods in jdk.internal.jar package as 
> jlink and jdeps both use them to would avoid duplicated code.

VersionedStream is now in jdk.internal.util.jar

>  
> 
>>> 
>>> This patch parse MR-JAR only if —-multi-release option is specified. It 
>>> would also be useful to analyze all versioned entries for the default 
>>> option (i.e. analyze direct dependencies from class files) that can be done 
>>> in a separate RFE.
>>> 
>>> Comments to this patch:
>>> 
>>> ClassFileReader.java
>>> 
>>> 386                         if (Integer.parseInt(v) < 9) {
>>> 387                             String[] msg = 
>>> {"err.multirelease.jar.malformed",
>>> 388                                     jarfile.getName(), rn
>>> 389                             };
>>> 390                             throw new MultiReleaseException(msg);
>>> 391                         }
>>> 
>>> To get here, I can think of the case when it’s not a MRJAR (so 
>>> JarFile::stream returns all entries).
>> 
>> fixed 
>> 
>>> If it’s a MR-JAR, the JarFile will be opened with a valid version.  
>>> versionedStream should only return the proper versioned entries.  Maybe you 
>>> should emit warning (add it to skippedEntries if this happens) or make it 
>>> an assert.
>> 
>> I’m not sure what you mean.
> 
> My point is that JarFile::getEntry should not return such JarEntry - is that 
> true?
> 
> In that case, how SharedSecrets.javaUtilJarAccess().getRealName(jarfile, e) 
> would return META-INF/versions/$n  where n < 9?
> 
> This is not an expected error and so InternalError (or assert) is more 
> appropriate than throwing MultiReleaseException.

I put an assert in.

> 
>> 
>>> 
>>> Can you add the following scenario in the new test and Bar and Gee are 
>>> public and shows the result when -—multi-release 9 or 10 or base?
>>> p/Foo.class
>>> META-INF/versions/9/p/Foo.class
>>> META-INF/versions/9/q/Bar.class
>>> META-INF/versions/10/q/Bar.class
>>> META-INF/versions/10/q/Gee.class
>> 
>> One can not put new public classes in the versioned section, so that layout 
>> is not legal

If I make Bar and Gee non-public, I can build a jar with them in it.  See the 
second test I added in test.tools.jdep.MultireleaseJar

> 
> But such JAR file can be created.  What about adding a non-public class under:
>    META-INF/versions/9/q/Zee.class
>    META-INF/versions/10/q/Zee.class
> 
> Keeping public q/Bar.class is okay as JarFile::getName(“q/Bar.class”) should 
> return null if not allowed for any Runtime.Version.

jar tool won’t validate a q.Bar as a public class.  

> 
>> 
>>> 
>>> JDK-8163798 would cover more scenarios in depth.  I’m okay to use the 
>>> versionedStream you have and leave that to JDK-8163798.
>> 
>>> BTW the copyright header is missing in the new tests.
>> 
>> All the existing test input source files do not have the copyright header.  
>> These little classes are just there to feed the test that does have the 
>> required copyright
> 
> I put the copyright headers in all source files, including tiny test classes.

Done.

> 
>> 
>>> 
>>> JdepsTask.java
>>> 401                             throw new 
>>> BadArgs("err.multirelease.option.illegal", arg);
>>> 
>>> You can simply use err.invalid.arg.for.option which I think is simple and 
>>> adequate.
>> 
>> That’s not an existing property, so I left it where it is with all the 
>> multi-release properties
> 
> err.invalid.arg.for.option is an existing property.

Okay.  Unfortunately we lose a better error message.

> 
>> 
>>> jdeps.properties: what about a shorter version:
>>> 
>>> --multi-release <version>         Specifies the version when processing
>>>                                  multi-release jar files. <version> can be
>>>> = 9 or base.
>> 
>> I did that but I think it’s more confusing
> 
> User guides, man page to include examples would help that.
> 
> Mandy
> 

Reply via email to