使用Java9的module-info.java放在哪里? [英] Where to place module-info.java using Java 9?
本文介绍了使用Java9的module-info.java放在哪里?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个OSGI应用程序,我有大约30个包(JAR文件)。今天,我决定看看它是如何工作的/是否与Java9一起工作。
所以我启动了我的应用程序并获得了
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
并创建了module-info.java文件,内容如下:
module org.apache.felix.framework { }
我有两个问题。我应该将这个module-info.java放在哪里才能让JVM读取它?如何将此模块信息与org.apache.felix.framework-5.4.0.jar
文件/捆绑包/JAR绑定?
如果我做错了所有事情,请为我指明解决此问题的正确方向。
推荐答案
通用提示:
- 您应该阅读the State of the Module System以熟悉JPMS。或者,也可以查看this module system tutorial(免责声明:我是作者)。
- 如answer to your other question中所述,如果您不想创建模块,则无需创建。
回答您的特定问题:
模块声明(module-info.java
)需要进入源根目录(例如src/main/java
)。然后它必须在要编译的文件列表中,因此它将转换为模块描述符(module-info.class
)。最后一步是将其包含在打包到JAR中的类文件列表中。(在JAR中有模块描述符会将其转换为模块化JAR。如果放置在模块路径上,JPMS会将其转换为模块。)
如果您最终不想创建模块,而希望代码在未命名的模块中运行,则可以允许它使用占位符ALL-UNNAMED
访问内部API-在出现警告的情况下,您需要打开该包以进行反射:
--add-opens java.base/java.net=ALL-UNNAMED
不过,更好的解决方案是停止使用内部API。😉因为这不是您的代码,而是您的依赖项,您应该查找或打开Apache Felix的问题,该问题要求删除内部API的访问。
这篇关于使用Java9的module-info.java放在哪里?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文