使用Java9的module-info.java放在哪里?

本教程将介绍使用Java9的module-info.java放在哪里?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

使用Java9的module-info.java放在哪里? 教程 第1张

问题描述

我有一个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中有模块描述符会将其转换为。如果放置在模块路径上,JPMS会将其转换为模块。)

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

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

不过,更好的解决方案是停止使用内部API。?因为这不是您的代码,而是您的依赖项,您应该查找或打开Apache Felix的问题,该问题要求删除内部API的访问。

好了关于使用Java9的module-info.java放在哪里?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。