I have an OSGI application and I have around 30 bundles (jar files). Today I decided to see how it works/if it works with Java 9.
So I started my application and got
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.felix.framework.util.SecureAction (file:/home/.../jar/org.apache.felix.framework-5.4.0.jar) to method java.net.URLClassLoader.addURL(java.net.URL)
WARNING: Please consider reporting this to the maintainers of org.apache.felix.framework.util.SecureAction
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
After some reading I added command line option
--add-exports java.base/java.net=org.apache.felix.framework
and created file module-info.java with the following content:
module org.apache.felix.framework { }
And I have two questions. Where should I place this module-info.java to make jvm read it? How should I bind this module-info with org.apache.felix.framework-5.4.0.jar
file/bundle/jar?
If I do everything wrong please, show me right direction for fixing this problem.
Generic tips:
To answer your specific questions:
Place module declaration (
module-info.java
) into the project's source root directory (e.g.src/main/java
). It must be among the list of files to compile to be turned into a module descriptor (module-info.class
). Last step is to include it in the list of class files that are packaged into a JAR. Having a module descriptor in a JAR turns it into a modular JAR. If placed on the module path, the JPMS turns it into a module.If you don't want to create modules after all and prefer your code to run in the unnamed module, you can allow it to access internal APIs with the placeholder
ALL-UNNAMED
- in the case f your warning you need to open that package to reflection:The better solution would be to stop using internal APIs, though. As this is not your code, but your dependency, you should look for or open an issue with Apache Felix that asks to remove the access of internal API.