标签: java-11

使用 JDK 11 HttpClient 进行代理身份验证

我正在尝试使用 JDK 11 HttpClient通过需要通过登录名和密码进行身份验证的公司代理发出请求。根据JDK的介绍,我正在通过以下方式构建客户端实例:

HttpClient httpClient = HttpClient.newBuilder()
        .version(HTTP_1_1)
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.mycompany.com", 3128)))
        .authenticator(authenticator)
        .build();
Run Code Online (Sandbox Code Playgroud)

,哪里authenticator是:

Authenticator authenticator = new Authenticator() {
  @Override
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication("login", "password".toCharArray());
  }
};
Run Code Online (Sandbox Code Playgroud)

然后我执行请求本身:

HttpRequest outRequest = HttpRequest.newBuilder()
        .version(HTTP_1_1)
        .GET()
        .uri(URI.create("https://httpwg.org/asset/http.svg")) // no matter which URI to request
        .build();
HttpResponse<String> inResponse = httpClient.send(outRequest, BodyHandlers.ofString());
Run Code Online (Sandbox Code Playgroud)

但是,我收到的不是来自目标服务器 ( https://httpwg.org )的有效响应,而是HTTP 407(需要代理身份验证),即HttpClient不使用提供的authenticator.

我已经尝试了这里这里提到的各种解决方案,但没有一个有帮助。

使它工作的正确方法是什么?

java http-proxy java-http-client java-11

8
推荐指数
2
解决办法
3989
查看次数

如何处理 Java 11 中缺少的 Swing PLAF 类?

出于某种原因,我们使用com.sun.java.swing.plaf.windows.WindowsComboBoxUI在 Java 5.0 到 Java 8.0 的 Windows/Linux/Mac OS 平台上工作的类

从 Java 10 和 Java 11 开始(我们将坚持它作为 LTS)这个类对类加载器不可见:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/java/swing/plaf/windows/WindowsComboBoxUI
at xxx.YYY.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.java.swing.plaf.windows.WindowsComboBoxUI
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
Run Code Online (Sandbox Code Playgroud)

我们怎样才能让它工作?

java swing look-and-feel java-10 java-11

8
推荐指数
1
解决办法
5104
查看次数

在 module-info.java 中找不到所需的模块

module-info.java当我运行 gradle 时,没有找到我声明的所有必需模块:

/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:10: error: module not found: com.jfoenix
        requires com.jfoenix;
                    ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:11: error: module not found: google.api.client
        requires google.api.client;
                           ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:12: error: module not found: google.api.services.gmail.v1.rev83
        requires google.api.services.gmail.v1.rev83;
                                             ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:13: error: module not found: google.http.client
        requires google.http.client;
                            ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:14: error: module not found: google.http.client.jackson2
        requires google.http.client.jackson2;
                                   ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:15: error: module not found: google.oauth.client
        requires google.oauth.client;
                             ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:16: error: module not found: google.oauth.client.java6
        requires google.oauth.client.java6;
                                    ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:17: error: module not found: google.oauth.client.jetty
        requires google.oauth.client.jetty;
                                    ^
/Users/Joseph/eclipse-workspace/CheckMyDigitalFootprint/src/main/java/module-info.java:18: error: module not …
Run Code Online (Sandbox Code Playgroud)

java gradle java-module module-info java-11

8
推荐指数
1
解决办法
2490
查看次数

Java NIO 无法从 JRT 映像读取文件

当我们通过JLINK创建Java运行时需要的所有Java类/资源,并把它们变成JRT映像文件:lib/modules

这是我使用的基本 Maven 项目资源结构:

src
  main
    resources
      dict
        xkcd_en
Run Code Online (Sandbox Code Playgroud)

我只是想阅读xkcd_en文本文件。如果我们查看 JRT 文件,它是:

>> jimage list /path/to/lib/modules
...
Module: main
    dict/xkcd_en
...
Run Code Online (Sandbox Code Playgroud)

此外,我已明确在 中打开它module-info,以防万一:

module main {
    opens dict;
    // ..rest code omitted
}
Run Code Online (Sandbox Code Playgroud)

我可以读取文件的唯一方法是将其作为输入流获取:

作品:

public static InputStream getResourceAsStream(String resource) {
    return FileUtils.class.getResourceAsStream(resource);
}

System.out.println(new BufferedReader(
    new InputStreamReader(getResourceAsStream("/dict/xkcd_en")))
            .lines().collect(Collectors.joining("\n"))
);
Run Code Online (Sandbox Code Playgroud)

不工作:

但是,如果我试图获取文件 URI 并通过 Java NIO API 读取它,则它不起作用:

public static URL getResourceOrThrow(String resource) {
    URL url = FileUtils.class.getResource(resource);
    Objects.requireNonNull(url);
    return url;
}
Run Code Online (Sandbox Code Playgroud)

1 - …

java nio java-module java-11

8
推荐指数
1
解决办法
1492
查看次数

在 Java 中获取文件大小的最新方法

我知道这个问题已在不同的帖子中广泛讨论:

我的问题是我需要获取大量文件(HD 中存在的常规文件)的大小,为此我需要一个提供最佳性能的解决方案。我的直觉是应该通过直接读取文件系统表的方法来完成,而不是通过读取整个文件内容来获取文件的大小。看文档很难知道具体使用了哪种方法。

本页所述

Files 有 size() 方法来确定文件的大小。这是最新的 API,推荐用于新的 Java 应用程序。

但这显然不是最好的建议,就性能而言。我对不同的方法进行了不同的测量:

  1. file.length();

  2. Files.size(path);

  3. BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class); attr.size();

令我惊讶的是,这file.length();是最快的,必须创建一个File对象而不是使用较新的Path. 如果这也读取文件系统或内容,我现在不会。所以我的问题是:

在最新的 Java 版本 (9/10/11) 中,最快的、推荐的获取文件大小的方法是什么?


编辑

我认为这些细节不会为问题增加任何内容。基本上基准是这样的:

Length: 49852  with previous instanciation: 84676
Files: 3451537 with previous instanciation: 5722015
Length: 48019 with previous instanciation:: 79910
Length: 47653 with previous instanciation:: 86875
Files: 83576 with previous instanciation: 125730
BasicFileAttr: 333571 with previous instanciation:: 366928
..... …
Run Code Online (Sandbox Code Playgroud)

java performance filesize java-11

8
推荐指数
0
解决办法
2179
查看次数

Flyway 找不到类路径:db/migrations

我现在刚刚在 Intellij 中开始了一个新项目,使用 Spring Boot ver 2.1.3 和 Flyway 5.2.4 和 Java 11。

尝试开始我的项目后,我得到了:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flyway' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.core.Flyway]: Factory method 'flyway' threw exception; nested exception is java.lang.IllegalStateException: Cannot find migrations location in: [classpath:db/migration] (please add migrations or check your Flyway configuration)
Run Code Online (Sandbox Code Playgroud)

我有以下文件夹:

在此处输入图片说明

如您所见,我有“db/migration”但没有任何迁移,我现在才开始。调试 FlywayAutoConfiguration 类,我得到以下信息:

在此处输入图片说明

因此,我尝试返回“类路径:”中的所有文件,请参阅:

在此处输入图片说明

请注意,我只有“application.properties”文件。

java flyway java-11

8
推荐指数
3
解决办法
2万
查看次数

从 maven 使用 JavaFX11 构建可执行 JAR

我制作了一个使用 Maven、JavaFX 和其他一些依赖项的 Java 应用程序。以前,构建一个可执行的 jar 很容易,但由于 Java11 是模块化的并且不包含 JavaFX,我无法构建一个可用的 jar。

我已经尝试了很多东西,但我不知道我现在应该做什么。

我的 pom.xml

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <outputDirectory>out/</outputDirectory>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>fr.crosf32.fxtest.Entry</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
Run Code Online (Sandbox Code Playgroud)

我尝试构建包含所有依赖项的工件,但在运行时出现错误 (java -jar ):

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javafx/application/Application
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at fr.crosf32.fxtest.SlimForest.lambda$new$0(SlimForest.java:26)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) …
Run Code Online (Sandbox Code Playgroud)

maven java-11 javafx-11

8
推荐指数
1
解决办法
8271
查看次数

E: 无法找到软件包 openjdk-11-jdk

我尝试创建 docker 镜像:

这是我的 Dockerfile:

FROM maven:3-jdk-11

# Common files and utils for build
RUN apt-get update && apt-get install -y make fakeroot rpm dpkg-dev apt-utils wget unzip
RUN apt-get install -y -q software-properties-common desktop-file-utils

# Then Wine with all deps
RUN dpkg --add-architecture i386 && apt-get update
RUN apt-get install -y --install-recommends wine
RUN apt-cache search openjdk
RUN apt-get install -y openjdk-11-jdk
RUN apt install -y openjfx11 libopenjfx-java libopenjfx-jni
RUN apt-get install -y --install-recommends wine32

ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
ENV …
Run Code Online (Sandbox Code Playgroud)

debian maven docker java-11

8
推荐指数
1
解决办法
2万
查看次数

如何测试 java.net.http (Java 11) 请求 BodyPublisher?

我正在尝试测试使用新 Java 11 的代码java.net.http.HttpClient

在我的生产代码中,我有这样的事情:

HttpClient httpClient = ... (gets injected)

HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://localhost:1234"))
        .POST(HttpRequest.BodyPublishers.ofByteArray("example".getBytes()))
        .build();

return httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray());
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我模拟HttpClientjava.net.http.HttpRequest. 如何获取/测试其请求正文(= my "example")?我可以打电话request.bodyPublisher()来获取HttpRequest.BodyPublisher,但后来我被卡住了。

  • 我试图将它转换为jdk.internal.net.http.RequestPublishers.ByteArrayPublisher(它实际上是),但它不会编译,因为模块没有导出相应的包。
  • 我已经检查了HttpRequest.BodyPublisher-interface ( .contentLength(), .subscribe(subscriber)) 中的可用方法,但我想它们是不可能的。
  • 我试图只创建一个新的BodyPublisher并使用 比较它们.equals(),但没有真正的实现,所以比较总是错误的。

java java-http-client java-11

8
推荐指数
1
解决办法
2534
查看次数

为什么 Java11 将 java.util.zip.ZipFile$Source 保留在堆上?

有人可以帮助我理解我所看到的是 Java11 中故意的、正确的行为还是某种泄漏吗?让我们看一个愚蠢简单的 hello world 应用程序:

package com.example;

public class HelloWorld {
    public static void main(String[] args) throws InterruptedException {
        for( int i =0 ; i < 50; i++){
            Thread.sleep(1000);
            System.out.println("hello " + i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

唯一有趣的部分是 jar 依赖项。它可以是任何 jar,但为了让问题更加引人注目,让我们使用一个大的 - 旧的 gwt-user jar,它重 30MB:

plugins {
    id 'java'
}

group 'com.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    // https://mvnrepository.com/artifact/com.google.gwt/gwt-user
    compile group: 'com.google.gwt', name: 'gwt-user', version: '2.7.0'
}

Run Code Online (Sandbox Code Playgroud)

运行应用程序,打开 jvisualvm,进行转储并查找保留的一组java.util.zip.ZipFile$Source

jvisualvm 堆转储

类路径中的 jar(实际上从未使用过)占用 1.5MB 的堆。它不会在 GC …

memory-leaks heap-dump java-memory-leaks java-11 openjdk-11

8
推荐指数
1
解决办法
5975
查看次数