On 16/11/2020 18:35, Alex Orlov wrote:
:
When I start my application I get:
java.lang.IllegalAccessError: class org.springframework.core.log.CompositeLog (in module spring.core) cannot access class org.apache.commons.logging.impl.NoOpLog (in module org.apache.commons.logging) because module org.apache.commons.logging does not export org.apache.commons.logging.impl to module spring.core.
To fix it, I wanted in the Framework dynamically addOpens to module (module.addOpens(...)), however, I got
Caused by: java.lang.IllegalCallerException: org.apache.commons.logging.impl is not open to module fw.module.
To fix it I added jvm argument:
--add-opens org.apache.commons.logging/org.apache.commons.logging.impl=fw.module \
However, it didn’t help. It seems to me that jvm arguments add-opens works only when the module that must open
its package is in boot layer, but in my situation fw.module that is in boot
layer knows nothing about web application modules.
The static defineModulesXXXX methods return a ModuleLayer.Controller
that can be used to export or open any package of any module in the
layer to any other module. It's the equivalent of using the
--add-exports or --add-opens on the command line to export or open
packages of modules in the boot layer. So in this case you should be
able to use the ModuleLayer.Controller for (I assume) the "Web
Application Layer" to export
org.apache.commons.logging/org.apache.commons.logging.impl to
spring.core. That can be a workaround using spring.core and
org.apache.commons.logging agree sort out their differences on whether
org.apache.commons.logging.impl is part of the supported API or not.
-Alan.