【问题标题】:Where to place module-info.java using Java 9?使用 Java 9 在哪里放置 module-info.java?
【发布时间】:2018-02-14 03:08:11
【问题描述】:

我有一个 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 文件/捆绑包/jar 绑定?

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

【问题讨论】:

  • 这可能不值得回答,但如果有帮助,here 是 Java 9 中的一个小例子。请参阅 OSGi (Java 8) 中的版本链接。

标签: java osgi apache-felix java-9 java-platform-module-system


【解决方案1】:

一般提示:

回答您的具体问题:

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

【讨论】:

  • 谢谢。好的,我不想创建任何模块,我希望它们不被命名。但是我应该如何解决WARNING: An illegal reflective access operation has occurred 问题呢?
  • 更新了答案以包含ALL-UNNAMED
  • 非常感谢,但 -add-exports java.base/java.net=ALL-UNNAMED--add-exports java.base/java.net=ALL-UNNAMED 没有帮助。我得到同样的错误。
  • 是的,抱歉,我没有仔细查看您的日志。顺便说一句,这“只是”一个警告,而不是错误。
  • @Pavel_K 显然昨天有点晚了。是的,你需要 = 在那里(更正了答案),但它应该可以工作(它对我有用)。
【解决方案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?

进一步编译和打包模块(绑定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 所需的明确的逐步过渡。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2016-01-10
      • 2011-01-04
      • 2016-08-27
      • 1970-01-01
      相关资源
      最近更新 更多