3

我想用ResponseSubscribers.ByteArraySubscriber那个在jdk.internal.net.http. 我使用openjdk11。

我尝试了两件事:

1/ 我添加到 Maven 编译器插件导出模块

<compilerArgs>
    <arg>--add-exports</arg><arg>java.net.http/jdk.internal.net.http=fr.app</arg>
</compilerArgs>

-> 它编译!

2/ 我创建了 module-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

fr.app.AppException:java.io.IOException:类 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对吗?

4

2 回答 2

2

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

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

因此,您MyClass位于未命名的模块中,错误内容如下

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


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

于 2019-01-02T00:49:53.443 回答
0

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

于 2019-01-03T14:52:57.120 回答