Use jdk.internal.net.http



我想使用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>

->编译!

阿拉伯数字/我创建了模块信息.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;
}

运行使用类导入jdk.internal.net.http的 junit 测试时

出错

fr.app.AppException: java.io.IOException: class fr.app.MyClass$BodySubscribers(在未命名的模块 @0x6537cf78 中)无法访问类 jdk.internal.net.http.ResponseSubscribers$ByteArraySubscriber(在模块 java.net.http 中),因为模块 java.net.http 不会将 jdk.internal.net.http 导出到未命名的模块@0x6537cf78

我知道BodySubscribers必须仅在命名模块中导出。但是我的模块名称fr.app对吗?

但是我的模块是名称 fr.app 对吗?

不是真的,虽然您在项目中创建了module-info.java,但在应用程序执行期间,您的实际代码似乎最终会在类路径中找到。

因此,您的MyClass驻留在未命名的模块中,错误如下

类 fr.app.MyClass$BodySubscribers (在未命名模块中.....


另一方面,您提到的类似乎是打包在 java.net.http 模块内部的,不应依赖于您的代码。您必须实现自己的订阅者,即使您希望使用与您正在查看的代码类似的功能。因为该模块无论如何都不会将其导出供公众使用。

你不应该直接使用任何jdk.internal.*包中的任何类。您是否尝试过改用公共 API HttpResponse.BodySubscribers.ofByteArray()

最新更新