From the Tomcat Dev List ...

Sent from my iPhone

Begin forwarded message:

> From: Mark Thomas <[email protected]>
> Date: November 5, 2020 at 4:57:58 AM PST
> To: Tomcat Developers List <[email protected]>
> Subject: Working around a JRE bug
> Reply-To: "Tomcat Developers List" <[email protected]>
> 
> All,
> 
> The summary:
> 
> - The JVM spec states that the ModulePackages attribute in
>  module-info.class DOES NOT have to list ALL packages in the module
> - bnd is consistent with the JVM spec and only lists the packages that
>  are required to be listed
> - the JRE uses a broken class loader optimisation that assumes that
>  ModulePackages DOES list ALL packages present in the module
> 
> When applications try and use our JARs with bnd provided module-info
> CNFE occur because the JRE can't find the module for some classes.
> 
> For a fuller description of the issue see:
> https://bugs.openjdk.java.net/browse/JDK-8255854
> 
> This is likely the cause of several currently open bugs reports of CNFE
> when using modules.
> 
> 
> Possible solutions:
> 
> 1. OpenJDK accepts the class loader optimisation is flawed and reverts
>   it.
>   Given the reaction so far to the reported bug this looks unlikely.
>   Even if this were to happen, class loading performance would be
>   impacted and it is going to take a long time before all the broken
>   JREs have been updated.
> 
> 2. The bnd project updates bnd to implement what amounts to an
>   undocumented requirement that the ModulePackages attribute lists all
>   packages in the module.
>   This is probably the cleanest solution but depends on the goodwill of
>   the bnd project who would be well within their rights to reject it as
>   invalid based on the JVM spec. I haven't yet approached the bnd
>   project. A fix along these lines might be ready for the next release
>   round but is unlikely to be ready for this one.
> 
> 3. We drop all the JPMS meta-data until we have a solution.
>   I'm not sure of the consequences for users wanting to use Tomcat JARs
>   in a JPMS environment.
> 
> 4. We "patch" module-info after bnd has generated it via:
>   - custom code (BCEL probably helps)
>   - jar (if using Java 9+ jar rebuilds the module-info.class file)
> 
> 5. We add "unnecessary" @aQute.bnd.annotation.jpms.Open annotations to
>   packages so bnd includes them in module-info.
>   It might be hard to remove these at a later date if folks start to
>   depend on them.
> 
> 
> I am currently thinking along these lines:
> 
> - Add @aQute.bnd.annotation.jpms.Open where necessary to fix this.
> - Document clearly in the Javadoc, change log, the release announcement
>  and the RELEASE NOTES that this is a temporary workaround that will be
>  removed as soon as a better fix is available.
> - Ask the bnd project to make a change to list all packages in a module
>  in the ModulePackages attribute.
> 
> Thoughts?
> 
> Mark
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 

Reply via email to