Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java 9在何处放置module-info.java?_Java_Osgi_Apache Felix_Java 9_Java Platform Module System - Fatal编程技术网

使用java 9在何处放置module-info.java?

使用java 9在何处放置module-info.java?,java,osgi,apache-felix,java-9,java-platform-module-system,Java,Osgi,Apache Felix,Java 9,Java Platform Module System,我有一个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.

我有一个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 { }
我有两个问题。我应该将此模块放置在何处-info.java以使jvm读取它?如何将此模块信息与
org.apache.felix.framework-5.4.0.jar
file/bundle/jar绑定

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

一般提示:

  • 您应该阅读以熟悉JPMS。或者,看看(免责声明:我是作者)
  • 如中所述,如果不想创建模块,则无需创建模块
要回答您的具体问题:

模块声明(
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 如果您要在Java-9上启动一个项目,那么这是一个很好的开始

我应该将此模块放置在何处-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),您可以使用
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,我建议您遵循以下说明,即适应Java9需要一个明确的分步过渡。

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

谢谢。好的,我不想创建任何模块,我希望它们不命名。但是,我应该如何解决警告:出现了非法的反射访问操作问题?更新了答案以包括
ALL-UNNAMED
。非常感谢,但是
-add exports java.base/java.net=ALL-UNNAMED
-add exports java.base/java.net=ALL-UNNAMED
没有帮助。我也有同样的错误。是的,对不起,我没有仔细看你的日志。顺便说一句,这“只是”一个警告,而不是一个错误。@Pavel_K显然昨天晚了一点。是的,您需要
=
在那里(更正了答案),但它应该可以工作(对我来说是这样)。这可能不值得回答,但如果有帮助,这是Java 9中的一个小示例。有关OSGi(Java8)中的版本,请参见链接。