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

Where to place module-info.java using Java 9?

我有一个 OSGI 应用程序,并且有大约 30 个包(jar 文件)。今天我决定看看它是如何 works/if 它与 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 { }

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

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

一般提示:

回答您的具体问题:

模块声明 (module-info.java) 需要进入源代码根目录(例如 src/main/java)。然后它必须在要编译的文件列表中,因此它将变成 模块描述符 (module-info.class)。最后一步是将其包含在打包到 JAR 中的 class 文件列表中。 (在 JAR 中有一个模块描述符将它变成一个 模块化 JAR。如果放在模块路径上,JPMS 将它变成一个模块。)

如果您毕竟不想创建模块并且更喜欢您的代码而不是未命名模块中的 运行,您可以允许它使用占位符 [=14] 访问内部 APIs =] - 如果你收到警告,你需要打开那个包来反射:

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

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

的访问权限

嗯,如果您要在 Java-9 开始一个项目,那么 Jigsaw quick start 是一个很好的开始方式。

Where should I place this module-info.java to make jvm read it?

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

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

How should I bind this module-info with org.apache.felix.framework-5.4.0.jar file/bundle/jar?

进一步编译模块并打包它们(将 module-info.class 绑定到您的模块化 jar 的顶级目录),您可以使用 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.

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