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

时间:2017-09-05 18:42:32

标签: java osgi apache-felix java-9 jigsaw

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

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

module org.apache.felix.framework { }

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

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

3 个答案:

答案 0 :(得分:9)

通用提示:

回答您的具体问题:

模块声明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的访问权。

答案 1 :(得分:2)

如果您在Java-9上启动项目,那么Jigsaw quick start是一个很好的开始。

  

我应该把这个module-info.java放到哪里让jvm读取它?

从声明module org.apache.felix.framework { }推断您的模型名称,您应将module-info.java文件放在项目目录中:

src/org.apache.felix.framework/module-info.java 
  

我应该如何绑定此模块信息   org.apache.felix.framework-5.4.0.jar文件/ bundle / jar?

进一步编译模块并将它们打包(绑定模块化jar的顶级目录中的module-info.class),可以使用javacjar命令。

上述示例命令有点像:

$ javac --module-path mods -d mods/org.apache.felix.framework \
    src/org.apache.felix.framework/module-info.java src/org.apache.felix.framework/com/apache/felix/framework/Application.java


$ jar --create --file=mlib/org.apache.felix.framework.jar \
    --main-class=com.apache.felix.framework.Application -C mods/com.apache.felix.framework

此外,您可以使用以下方式执行模块:

$ java -p mlib -m com.apache.felix.framework

除了状态模块系统和快速入门文档之外,为了将现有项目迁移到Java-9,我建议您遵循JDK9 Migration Guide,其中指出了适应Java9所需的明确步骤转换

答案 2 :(得分:2)

你应该向Apache Felix提交一个错误,因为org.apache.felix.framework-5.4.0.jar中的代码正在进行非法访问,需要修复。我使用较新版本5.6.8和--illegal-access=debug进行了快速测试,看起来Felix有几个需要注意的问题。是的,您可以通过打开java.net包到" ALL-UNNAMED"来暂时消除上面的特定警告。但这只是一个或多个问题。