在哪里使用Java 9放置module-info.java?

Pav*_*l_K 11 java osgi java-platform-module-system apache-felix java-9

我有一个OSGI应用程序,我有大约30个捆绑(jar文件).今天我决定看看它是如何工作的/如果它适用于Java 9.

所以我开始申请并得到了

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
Run Code Online (Sandbox Code Playgroud)

经过一些阅读后,我添加了命令行选项

--add-exports java.base/java.net=org.apache.felix.framework 
Run Code Online (Sandbox Code Playgroud)

并使用以下内容创建文件module-info.java:

module org.apache.felix.framework { }
Run Code Online (Sandbox Code Playgroud)

我有两个问题.我应该把这个module-info.java放在哪里让jvm读取它?我该如何将这个模块信息与org.apache.felix.framework-5.4.0.jar文件/ bundle/jar绑定?

如果我做错了,请告诉我解决这个问题的正确方向.

Nic*_*lai 10

通用提示:

回答您的具体问题:

模块声明(module-info.java)需要进入你的源根目录下(如src/main/java).然后它必须在要编译的文件列表中,因此它将变为模块描述符(module-info.class).最后一步是将它包含在打包到JAR中的类文件列表中.(在JAR中具有模块描述符将其转换为模块化JAR.如果放置在模块路径上,则JPMS将其转换为模块.)

如果你不想创建模块并且更喜欢你的代码在未命名的模块中运行,你可以允许它使用占位符访问内部API ALL-UNNAMED- 如果你警告你需要打开该包来反射:

--add-opens java.base/java.net=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

但更好的解决方案是停止使用内部API.由于这不是您的代码,而是您的依赖项,您应该查找或打开Apache Felix的问题,该问题要求删除内部API的访问权限.