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:
The module declaration (
module-info.java
) needs to go into your source root directory (e.g.src/main/java
). It then has to be among the list of files to compile, so it will get 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.
You should submit a bug to Apache Felix as it's the code in org.apache.felix.framework-5.4.0.jar that is doing the illegal access and needs to be fixed. I did a quick test with newer version 5.6.8 and with
--illegal-access=debug
and it appears that Felix has several issues that need attention. Yes, you can temporarily eliminate the specific warning above by opening the java.net package to "ALL-UNNAMED" but that is just one or many issues.Well the Jigsaw quick start is a nice way to start off with if you're kick starting a project on Java-9.
Inferring your modeule name from the declaration
module org.apache.felix.framework { }
, you should place themodule-info.java
file in your project directory at:Further to compile modules and package them(bind the module-info.class at the top level directory of your modular jar), you can use the
javac
andjar
commands.Sample commands for the above would be somewhat like :
And further you can execute the module using:
Also apart from The State Module System and the Quick-Start documents, for migrating existing projects to Java-9, I would suggest you to follow the JDK9 Migration Guide which states a clear step wise transition required to adapt to Java9.