使用Java 9将模块信息.java放在哪里?

我有一个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

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

--add-exports java.base/java.net=org.apache.felix.framework 

并创建文件模块-info.java,内容如下:

module org.apache.felix.framework { }

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

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


答案 1

一般提示:

要回答您的具体问题:

模块声明 () 需要进入源根目录(例如 )。然后,它必须位于要编译的文件列表中,因此它将变成模块描述符()。最后一步是将其包含在打包到 JAR 中的类文件列表中。(在 JAR 中使用模块描述符会将其转换为模块化 JAR。如果放置在模块路径上,JPMS 会将其转换为模块。module-info.javasrc/main/javamodule-info.class

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

--add-opens java.base/java.net=ALL-UNNAMED

不过,更好的解决方案是停止使用内部API。


答案 2

推荐