使用Java9的module-info.java放在哪里? [英] Where to place module-info.java using Java 9?

查看:42
本文介绍了使用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绑定?

如果我做错了所有事情,请为我指明解决此问题的正确方向。

推荐答案

通用提示:

回答您的特定问题:

模块声明(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆