我面临着以下难题.我目前正在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的兼容性支持是什么.
我在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) 我在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.
我正在使用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)
但是现在输出我的所有列表.
马,豹,猫,狗,狮子
我有以下代码:
Stream<String> lines = reader.lines();
Run Code Online (Sandbox Code Playgroud)
如果第一个字符串等于"email"我要从流中删除第一个字符串。对于流中的其他字符串,我不需要此检查。
我怎么能做到?
当然,我可以将其转换为列表,然后使用旧式进行循环,但是进一步,我需要再次播放流。
(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 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 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)
在上面的代码中:
BodyHandler,当收到状态行和报头时,就认为收到了响应。这意味着当代码执行时,在 7 秒内要么抛出异常,要么到达最后一行。但是,最后一行不受任何超时的限制。如果服务器停止发送响应正文,最后一行将永远阻塞。
在这种情况下,如何防止最后一行挂起?
我有一个用 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 上尝试了所有相关问题,但没有成功。
我正在使用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) java-11 ×10
java ×9
maven ×3
java-8 ×2
concurrency ×1
eclipse ×1
http ×1
http2 ×1
java-module ×1
java-stream ×1
javafx ×1
jvm ×1
log4j2 ×1
multiplexing ×1
openjfx ×1
overriding ×1
predicate ×1
reflection ×1
ssl ×1
stream ×1