标签: java-11

如何在Java http客户端中自定义"主机"头

这是我的代码:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://127.0.0.1:8081/"))
    .header("Host", "test.example.com")
    .build();
client.send(request, HttpResponse.BodyHandlers.ofString());
Run Code Online (Sandbox Code Playgroud)

结果我看到上面的代码发送:

GET / HTTP/1.1
Connection: Upgrade, HTTP2-Settings
Content-Length: 0
Host: 127.0.0.1:8081
HTTP2-Settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
Upgrade: h2c
User-Agent: Java-http-client/10
Host: test.example.com
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它会发送两个Host标头(URI和我指定的Host标头),但我希望它发送我指定的标头,而不是URI中的标头.这个客户有可能吗?

编辑:在Java 11中,它变得更糟(你需要将client.send行改为:)client.send(request, HttpResponse.BodyHandlers.ofString());:

java.lang.IllegalArgumentException: restricted header name: "Host"
Run Code Online (Sandbox Code Playgroud)

如何自定义该标头(测试虚拟主机所需)?

我也试过setHeader并得到完全相同的问题(双头Host或异常).

编辑:我报告了一个JDK错误.

java http2 java-10 java-http-client java-11

7
推荐指数
1
解决办法
1822
查看次数

是否可以导入两个相同包装的罐子?

我正在将项目从Java 8迁移到Java 11,并且java 9中引入的模块化让我头疼.情侣罐有相同的包,但不同的类.这给了我错误

module SomeModule reads package my.package from both ModuleA and ModuleB
Run Code Online (Sandbox Code Playgroud)

我想知道如何处理这样的情况,因为并非所有的罐子都在我的控制之下,重构不是解决方案.

java java-9 java-module java-11

7
推荐指数
1
解决办法
130
查看次数

使类公开,但对JAR文件保持私有

有没有办法让Java类公开但只公开一个JAR文件?AKA,它不是私有包,而是公共包,但它不是公共JAR?

说我有这样的结构:

project/
  package1/
    One.java
  package2/
    Two.java
  package3/
    Three.java
Run Code Online (Sandbox Code Playgroud)

由于3 .java文件在不同的包中,我需要公开.但有没有办法让它们只对包含该项目的JAR公开?这样如果另一个项目导入JAR,它就看不到某些公共类/字段?

java maven java-platform-module-system java-11

7
推荐指数
2
解决办法
131
查看次数

为什么此示例程序中的OpenJDK 11 Java垃圾收集器“减少”了可用内存?

当我使用OpenJDK 11(在Windows 10上为Zulu发行版)编译并运行以下非常简单的Java程序时:

public class GCTest {
    public static void main(String[] args) {
        System.out.println("Free memory before garbage collection: " + Runtime.getRuntime().freeMemory());
        Runtime.getRuntime().gc();
        System.out.println("Free memory  after garbage collection: " + Runtime.getRuntime().freeMemory());
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来垃圾回收正在减少可用内存量:

Free memory before garbage collection: 266881496
Free memory  after garbage collection: 7772200
Run Code Online (Sandbox Code Playgroud)

当我使用Oracle Java 8运行它时,不会发生这种情况:

Free memory before garbage collection: 254741016
Free memory  after garbage collection: 255795064
Run Code Online (Sandbox Code Playgroud)

这是为什么?

java garbage-collection azul-zulu java-11

7
推荐指数
1
解决办法
943
查看次数

IOException - detail message all question marks

I want to createNewFile with a path but I got an IOException. The question is, the detailed message cannot be interpreted, I can only see a bunch of question marks.

在此处输入图片说明

I am with Windows 10 originally in Spanish, but with Chinese language pack installed. The java language already set to en and file encoding UTF-8:

java -version
Picked up _JAVA_OPTIONS: -Duser.country=US -Duser.language=en -Dfile.encoding=UTF-8
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build …
Run Code Online (Sandbox Code Playgroud)

java ioexception java-11

7
推荐指数
1
解决办法
202
查看次数

Pentaho Kettle Java 11 路线图

目前 Pentaho Kettle (v.9.1) 官方只支持 Java 8。这对我们来说是一个问题,因为我们正在维护一个需要 Java 11 的插件,因为一个需要 Java 11 的基本库。有没有人有关于路线图的详细信息迁移到 Java 11。我只能找到 Java 11 在路线图上的一些旧信息,但没有找到何时可用于 Kettle。

我们当前的解决方案是使用 Java 11。当从 bat/sh 文件中删除 JAVA_ENDORSED_DIRS 时,您可以运行 Spoon。但这不是最好的解决方案,因为应用程序不完全兼容,我们遇到了越来越多的问题。

也欢迎其他想法或解决方案。

java kettle pentaho-spoon pentaho-data-integration java-11

7
推荐指数
1
解决办法
1345
查看次数

最新 Mac OS 上的 Java 11 似乎一次锁定文件系统几分钟

由于在我的 Macbook Pro(最新操作系统等)上升级到 java 11,编译项目似乎经常长时间锁定整个文件系统。还有其他人有这个问题吗?任何想法如何调试它?

更新:我dtruss在这个过程中做了一个,我看到了像这样无休止的输出。我不知道这是否重要。

gettimeofday(0x700001D00D98, 0x0, 0x0)       = 0 0
gettimeofday(0x7000011DCE18, 0x0, 0x0)       = 0 0
psynch_cvwait(0x7F8EF6417C10, 0x89A0100089B00, 0x0)      = -1 316
gettimeofday(0x700001D00D98, 0x0, 0x0)       = 0 0
psynch_cvwait(0x7F8EF6417C10, 0x89B0100089C00, 0x0)      = -1 316
gettimeofday(0x700001D00D98, 0x0, 0x0)       = 0 0
psynch_cvwait(0x7F8EF6417C10, 0x89C0100089D00, 0x0)      = -1 316
gettimeofday(0x700001D00D98, 0x0, 0x0)       = 0 0
psynch_cvwait(0x7F8EF6417C10, 0x89D0100089E00, 0x0)      = -1 316
gettimeofday(0x700001D00D98, 0x0, 0x0)       = 0 0
psynch_cvwait(0x7F8EF6417C10, 0x89E0100089F00, 0x0)      = -1 316
Run Code Online (Sandbox Code Playgroud)

只是无休止地调用它,然后每隔一段时间:

stat64("<xxxx>.class\0", 0x700000CCBF30, 0x0)        = 0 …
Run Code Online (Sandbox Code Playgroud)

java macos java-11

7
推荐指数
0
解决办法
204
查看次数

javac 11 应该如何使用 Java 8 目标在更高版本中覆盖链接方法?

假设我使用的是Java 11javac,但我使用--source和--target选项设置为1.8以便我的源代码将被视为 Java 8 并且输出.class文件将与 Java 8 兼容。我的目标是生成.class可以运行的文件一个 Java 8 JVM。

假设我正在编译以下 Java 8 代码:

import java.nio.ByteBuffer;

…

ByteBuffer byteBuffer = …; //init somehow
byteBuffer.flip(); //what ends up in the `.class` file?
Run Code Online (Sandbox Code Playgroud)

问题是:Java 11 应该javac在.class文件中放什么来链接byteBuffer.flip()方法调用?在回答之前,请考虑以下问题:

java java-8 java-11

7
推荐指数
1
解决办法
427
查看次数

从 8 个并行流升级的 Java 11 抛出 ClassNotFoundException

我将 Spring Boot 应用程序从 Java 8 和 tomcat 8 升级到了 java 11 和 tomcat 9。除了我在列表上使用并行流的部分外,一切似乎都运行良好。

list.addAll(items
                .parallelStream()
                .filter(item -> !SomeFilter.isOk(item.getId()))
                .map(logic::getSubItem)
                .collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

前一部分代码过去在 Java 8 和 Tomcat 8 上工作得很好,但在Java 9 改变了如何使用 Fork/Join 公共池线程加载类之后,将系统类加载器作为它们的线程上下文类加载器返回。

我知道在后台并行流使用 ForkJoinPool 并且我创建了一个自定义 bean 类,但仍然没有被应用程序使用。很可能是因为它们可能是在这个 bean 之前创建的。

@Bean
public ForkJoinPool myForkJoinPool() {
    return new ForkJoinPool(threadPoolSize, makeFactory("APP"), null, false);
}

private ForkJoinPool.ForkJoinWorkerThreadFactory makeFactory(String prefix) {
    return pool -> {
        final ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
        worker.setName(prefix + worker.getPoolIndex());
        worker.setContextClassLoader(Application.class.getClassLoader());
        return worker;
    };
}
Run Code Online (Sandbox Code Playgroud)

最后,我还尝试将它包装在我的 ForkJoinPool 实例周围,但它是异步完成的,我不想这样做。我也不想使用提交和获取,因为这意味着我必须用 try/catch …

java parallel-processing spring java-stream java-11

7
推荐指数
1
解决办法
352
查看次数

为什么我的 CompletableFuture 代码在 Java 8 中运行而不在 Java 11 中运行?

为什么这段代码在 Java 8 和 Java 11 中表现不同?

private static String test2() {
    CompletableFuture
            .runAsync(() -> IntStream.rangeClosed(1, 20).forEach(x -> {
                try {
                    Thread.sleep(500);
                    System.out.println(x);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }));

    return "Finish";
}
Run Code Online (Sandbox Code Playgroud)

我希望它打印完成,然后以 500 毫秒的间隔打印从 1 到 20 的数字,然后停止执行,它在 Java 8 中正常工作。

然而,当我在 Java 11 上运行完全相同的方法时,它打印 Finish 并终止,而没有调用 runAsync(...) 代码。我设法通过添加这样的 ExecutorService 来启动它

private static String test2() {

    final ExecutorService executorService = Executors.newFixedThreadPool(10);
    CompletableFuture
            .runAsync(() -> IntStream.rangeClosed(1, 10).forEach(x -> {
                try {
                    Thread.sleep(500);
                    System.out.println(x);
                } catch (InterruptedException e) { …
Run Code Online (Sandbox Code Playgroud)

java multithreading asynchronous completable-future java-11

7
推荐指数
1
解决办法
373
查看次数