使用 jdk.internal.net.http

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>

-> 编译!

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;
}

运行 使用 class 导入的 junit 测试时出现错误 jdk.internal.net.http

fr.app.AppException: java.io.IOException: class fr.app.MyClass$BodySubscribers (in unnamed module @0x6537cf78) cannot access class jdk.internal.net.http.ResponseSubscribers$ByteArraySubscriber (in module java.net.http) because module java.net.http does not export jdk.internal.net.http to unnamed module @0x6537cf78

我明白 BodySubscribers 只能在命名模块中导出。但是我的模块名称是 fr.app 对吗?

But my module is name fr.app right ?

并非如此,当您在项目中创建 module-info.java 时,在执行应用程序期间,您的实际代码似乎最终 在 class 路径中找到.

因此您的 MyClass 驻留在 the unnamed module 中,错误如下

class fr.app.MyClass$BodySubscribers (in unnamed module.....


另一方面,您提到的 class 似乎被打包 internaljava.net.http 模块中,不应依赖于您的代码。即使您需要与正在查看的代码类似的功能,您也必须实现自己的订阅者。因为无论如何模块都不会导出它以供 public 使用。

您不应直接使用任何 jdk.internal.* 包中的任何 class。您是否尝试过使用 public API HttpResponse.BodySubscribers.ofByteArray()