标签: java-11

Java兼容性编译模式

我面临着以下难题.我目前正在32位和64位Windows机器上部署Java 8应用程序.

由于Java 8正在达到它的EoL,我开始面临下一步该做什么的非常困难的问题.

由于Oracle不会提供其新版Java版本的32位版本,我现在必须坚持使用8版,尽管转向OpenJDK的产品,他们似乎承诺支持甚至超过8的EoL.为此,我还将作为VM(提供32位版本)迁移到OpenJ9.

我的问题如下.我开始考虑转移到Java 11.我想知道,是否可以使用该jdk在兼容模式下编译并以不使用任何11个特定功能为代价来定位版本8?

也可以,编译后的代码在这样的组合中正确运行,即兼容编译的Java 11代码并部署到运行在32位的环境中?

我还想知道Java 11的兼容性支持是什么.

java jvm java-8 java-11

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

Eclipse 2018-09使用Java 11插件进入无限构建循环:ClosedFileSystemException

我在Windows 10上运行Eclipse 2018-09(4.9.0).我正在使用Open JDK 11 GA.我有一个使用Java 8兼容源代码的项目,可以使用Eclipse和Maven中的JDK编译.

我想使用新的Java 11功能,所以首先我将编译器源/目标从Java 8更改为Java 11.它仍然在命令行上使用Maven构建查找,但无法在Eclipse中编译(参见Eclipse 2018-09 won)编译Java 11源代码;认为它低于1.7).

所以我在Eclipse Marketplace中添加了"Java 11 Support for Eclipse 2018-09"插件.我重新启动了Eclipse并用于Alt+F5刷新我的Maven项目.Eclipse然后尝试重建项目.

现在Eclipse进入了一个无限循环,在8X%完成到9X%完成之间跳跃,重复,无休止的错误如下:

!SESSION 2018-09-27 08:08:51.188 -----------------------------------------------
eclipse.buildId=4.9.0.I20180906-0745
java.version=11
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US
Framework arguments:  -product org.eclipse.epp.package.jee.product
Command-line arguments:  -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.jee.product

This is a continuation of log file …\.metadata\.bak_0.log
Created Time: 2018-09-27 08:11:22.981

!ENTRY org.eclipse.core.resources 4 2 2018-09-27 08:11:22.981
!MESSAGE Problems occurred when invoking code from plug-in: …
Run Code Online (Sandbox Code Playgroud)

java eclipse maven java-11 eclipse-2018-09

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

如何用JDK 11打开JavaFX .jar文件?

我在IntelliJ中创建了一个JavaFX项目.我可以在IntelliJ中运行项目.我在配置中添加了以下代码:

--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml
Run Code Online (Sandbox Code Playgroud)

但是项目的输出.jar文件(由Artifects制作)不会运行.我测试了这些命令,但没有任何机会:

java  --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
java  --module-path %PATH_TO_FX% --add-modules javafx.controls  Timer.jar
Run Code Online (Sandbox Code Playgroud)

命令行的上一个错误日志:

Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib
Run Code Online (Sandbox Code Playgroud)

ps:在JDK-10上构建时,我可以运行这个项目的.jar文件

编辑:

我下载了JavaFX并将其lib文件夹添加到系统环境中.为了将JavaFX添加到项目中,我执行了以下过程:项目结构>库>添加> Java> JavaFxPath/lib

然后我在此过程中为输出jar文件创建了Artifect:项目结构> Artifects>添加> JAR>从具有依赖项的模块> main类:main.Main.

java javafx openjfx java-11

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

Java11中的谓词过滤所有元素

我正在使用Java11.学习一种新的方法Predicate.not,我发现我目前的代码只找到猫科:

List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
Set<String> filterCat = animals.stream().filter(cats).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)

输出是:

豹,猫,狮子

现在我正在尝试使用新方法,输出结果不正确.我该如何纠正?我做错了什么?

我后来的代码:

Predicate<String> updatedCatFilter = Predicate.not(a -> a.equals("dog") && a.equals("horse"));
Set<String> catFamily = animals.stream().filter(updatedCatFilter).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)

但是现在输出我的所有列表.

马,豹,猫,狗,狮子

java predicate functional-interface java-11

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

有条件地从流中删除第一个(索引为零)元素

我有以下代码:

Stream<String> lines = reader.lines();
Run Code Online (Sandbox Code Playgroud)

如果第一个字符串等于"email"我要从流中删除第一个字符串。对于流中的其他字符串,我不需要此检查。

我怎么能做到?

聚苯乙烯

当然,我可以将其转换为列表,然后使用旧式进行循环,但是进一步,我需要再次播放流。

java java-stream java-11

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

在没有模块的情况下访问 JDK 11 中的“sun.security.x509”?

(tl,dr 最后) 我们有一个生成自签名 SSL 证书的小方法,它显然依赖于sun.security.x509. 目前我们仍在使用 JDK8 构建它,因此,即使代码库的其余部分(它只是一个小的、单一的库)是使用 JDK11 构建并使用 JVM11 运行的。

不幸的是,主 JDK 中没有替换,按照(并且CertificateFactory几乎没有生成证书,与 javadoc 声明的相反......):

一种选择是使用 BouncyCastle,但这是我们真正不需要的额外 4MB,特别是对于这么小的任务,所以我正在考虑访问它的方法

从我所看到的,包和所需的类仍然是包,相关的类仍然存在(参见sun.security.x509github但在构建它时(使用 maven)我得到错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project: Compilation failure: Compilation failure:
[ERROR] OldSelfSignedCertificateGenerator.java:[20,25] package sun.security.x509 does not exist
[ERROR] OldSelfSignedCertificateGenerator.java:[71,45] cannot find symbol
[ERROR]   symbol:   class X509CertInfo
[ERROR]   location: class OldSelfSignedCertificateGenerator
Run Code Online (Sandbox Code Playgroud)

我正在搜索并添加:

<arg>--add-exports</arg><arg>java.base/sun.security.x509=ALL-UNNAMED</arg>
Run Code Online (Sandbox Code Playgroud)

到maven-compiler-plugin它有点工作 - 我只是WARNING不知道sun.security.x509包:

[WARNING] OldSelfSignedCertificateGenerator.java:[20,25] sun.security.x509.AlgorithmId is internal …
Run Code Online (Sandbox Code Playgroud)

java ssl maven java-11

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

Java 超级接口运行时差异 Java 8 与 Java 9

当使用 Java 8 和 Java 9 运行时,我注意到以下程序的输出有所不同。

import java.lang.reflect.Method;
public class OrderingTest {
    public static void main(String[] args) {
        ServiceImpl service = new ServiceImpl();
        for (Method method : service.getClass().getMethods()) {
            for (Class<?> anInterface : method.getDeclaringClass().getInterfaces()) {
                try {
                    Method intfMethod = anInterface.getMethod(method.getName(), method.getParameterTypes());
                    System.out.println("intfMethod = " + intfMethod);
                } catch (NoSuchMethodException e) { }
            }
        }
    }
}

class ServiceImpl implements ServiceX {
    @Override
    public Foo getType() { return null; }
}

interface ServiceX extends ServiceA<Foo>, ServiceB { }
abstract …
Run Code Online (Sandbox Code Playgroud)

java reflection overriding java-8 java-11

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

如何使用 Java 的 HttpClient 在慢速流响应主体上超时

当我需要以流方式处理响应时,我应该如何处理使用 Java 11 中包含的 HTTP 客户端挂起发送 HTTP 响应正文的服务器?

已经阅读文档,我知道,这是可以设置在连接超时和在请求超时:

HttpClient httpClient = HttpClient.newBuilder()
        .connectTimeout(Duration.ofSeconds(2))
        .build();

HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("http://example.com"))
        .timeout(Duration.ofSeconds(5))
        .build();

HttpResponse<Stream<String>> httpResponse = httpClient
        .send(httpRequest, HttpResponse.BodyHandlers.ofLines());

Stream<String> responseLineStream = httpResponse.body();
responseLineStream.count();
Run Code Online (Sandbox Code Playgroud)

在上面的代码中:

  • 如果在 2 秒内无法建立连接,则会抛出超时异常。
  • 如果在 5 秒内没有收到响应,则会抛出超时异常。通过实验,定时器在连接建立后启动,对于这种类型BodyHandler,当收到状态行和报头时,就认为收到了响应。

这意味着当代码执行时,在 7 秒内要么抛出异常,要么到达最后一行。但是,最后一行不受任何超时的限制。如果服务器停止发送响应正文,最后一行将永远阻塞。

在这种情况下,如何防止最后一行挂起?

java http java-http-client java-11

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

编译失败:找不到模块:org.apache.logging.log4j

我有一个用 Java 11 编写的简单应用程序。mvn clean verify(maven 3.6.0)执行时出错:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project parser: Compilation failure
[ERROR] ...src/main/java/module-info.java:[2,32] module not found: org.apache.logging.log4j  
Run Code Online (Sandbox Code Playgroud)

依赖项:

<log4j.version>2.11.1</log4j.version>

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

模块信息.java:

module abc {
    requires org.apache.logging.log4j;
}
Run Code Online (Sandbox Code Playgroud)

Log4j2 配置是默认的并且在 .xml 文件中。用法:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

private static final Logger logger = LogManager.getLogger(Abc.class); 

logger.info("Boom!");
Run Code Online (Sandbox Code Playgroud)

我在 stackoverflow 上尝试了所有相关问题,但没有成功。

java maven log4j2 java-module java-11

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

Java 11 HttpClient Http2 流过多错误

我正在使用HttpClientJava 11 将请求发布到 HTTP2 服务器。HttpClient 对象被创建为一个 Singleton Spring bean,如下所示。

@Bean
    public HttpClient getClient() {
                return HttpClient.newBuilder().version(Version.HTTP_2).executor(Executors.newFixedThreadPool(20)).followRedirects(Redirect.NORMAL)
                .connectTimeout(Duration.ofSeconds(20)).build();
    }

I am using the sendAsync method to send the requests asynchronously.

When I try to hit the server continuously, I am receiving the error after certain time "java.io.IOException: too many concurrent streams". I used Fixed threadpool in the Client building to try to overcome this error, but it is still giving the same error.

The Exception stack is..

java.util.concurrent.CompletionException: java.io.IOException: …
Run Code Online (Sandbox Code Playgroud)

concurrency stream multiplexing http2 java-11

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