问题描述
我想使用jdk.internal.net.http中的ResponseSubscribers.ByteArraySubscriber。我使用的是Openjdk11。我尝试了两种方法:
1/ 我添加了maven编译器插件导出模块
<compilerArgs> <arg>--add-exports</arg><arg>java.net.http/jdk.internal.net.http=fr.app</arg> </compilerArgs>
->编译!
2/ 我创建了模块-info.java
module fr.app { requires java.net.http; requires com.fasterxml.jackson.core; requires com.fasterxml.jackson.databind; requires com.fasterxml.jackson.datatype.jsr310; exports fr.app; exports fr.app.parser; }
运行使用类导入的junit测试时出错jdk.internal.net.http
我知道BodySubscribers必须仅在命名模块中导出。但我的模块名为fr.app,对吗?fr.app.AppException:java.io.IOException:类fr.app.MyClass$BodySubscribers(在未命名模块@0x6537cf78中)无法访问类jdk.internal.net.http.ResponseSubscribers$ByteArraySubscriber(在模块java.net.http中),因为模块java.net.http不会将jdk.inder.net.http导出到未命名模块@0x6537cf78
推荐答案
但我的模块名为fr.app,对吗?
并非如此,虽然您在项目中创建了module-info.java,但在应用程序的执行过程中,您的实际代码似乎最终会在类路径上找到。
因此您的MyClass驻留在the unnamed module中,错误如下
类fr.app.MyClass$BodySubscribers(在未命名的模块中.....
另外,您提到的类似乎是打包到java.net.http模块的内部,不应该从您的代码中依赖。您必须实现您自己的订阅者,即使您希望获得与您正在查看的代码类似的功能。因为模块无论如何都不会将其导出用于公共用途。