我有一个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绑定?
如果我每件事都做错了,请告诉我解决这个问题的正确方向。
发布于 2017-09-06 05:21:38
通用提示:
要回答您的特定问题:
模块声明(module-info.java)需要进入源根目录(例如src/main/java)。然后它必须在要编译的文件列表中,所以它将被转换为一个模块描述符(module-info.class)。最后一步是将其包含在打包到JAR中的类文件列表中。(在JAR中有一个模块描述符会把它变成一个模块化的JAR。如果放置在模块路径上,JPMS会将其转换为模块。)
如果你根本不想创建模块,并且希望你的代码在未命名的模块中运行,你可以允许它使用占位符ALL-UNNAMED访问内部APIs在你的警告的情况下,你需要打开那个包来反射:
--add-opens java.base/java.net=ALL-UNNAMED不过,更好的解决方案是停止使用内部API。由于这不是您的代码,而是您的依赖项,您应该查找或打开Apache Felix的问题,该问题要求删除对内部API的访问。
发布于 2017-09-06 10:26:29
如果您正在启动一个基于Jigsaw quick start -9的项目,那么它是一个很好的入门方式。
我应该把这个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文件/捆绑包/jar绑定?
此外,要编译模块并将其打包(在模块化jar的顶级目录中绑定模块-info.class),您可以使用javac和jar命令。
上面的命令示例类似于:
$ 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所需的明确的逐步过渡。
发布于 2017-09-06 16:25:31
您应该向Apache Felix提交一个bug,因为这是org.apache.felix.framework-5.4.0.jar中执行非法访问的代码,需要修复。我用较新的版本5.6.8和--illegal-access=debug进行了快速测试,发现Felix有几个问题需要注意。是的,您可以通过将java.net包打开为"ALL-UNNAMED“来暂时消除上面的特定警告,但这只是一个或多个问题。
https://stackoverflow.com/questions/46061428
复制相似问题