我有一些代码使用JAXB API类,它们是作为Java 6/7/8中JDK的一部分提供的.当我使用Java 9运行相同的代码时,在运行时我得到错误,指示无法找到JAXB类.
自Java 6以来,JAXB类已作为JDK的一部分提供,为什么Java 9不再能够找到这些类?
在过去,Oracle曾经发布过Windows的可执行安装程序,它将:
从Java 11开始,Oracle的免费Java版本(Oracle OpenJDK)似乎不包含安装程序.它只是一个包含二进制文件的zip文件.
我们如何在Windows上安装OpenJDK 11,因为上述集成不再存在?他们不是必要的吗?
在我的 build.gradle 文件中,我升级了一个依赖项的版本(即:com.db:microservice-commons)。加载 gradle 更改后,我收到以下错误消息:
> Build file 'C:\Projects\Container\mschmidt\mount\booking-service\standalone\build.gradle' line: 50
> A problem occurred evaluating project ':standalone'.
> Could not resolve all files for configuration ':standalone:runtimeClasspath'.
> Could not resolve com.db:microservice-commons:2.4.1.
Required by:
project :standalone
project :standalone > project :service
> No matching variant of com.db:microservice-commons:2.4.1 was found. The consumer was configured to find a runtime of a library compatible with Java 10, packaged as a jar, preferably optimized for standard JVMs, and its dependencies declared externally but:
- …Run Code Online (Sandbox Code Playgroud) 我有一个简单的Maven项目:
src
??? main
??? java
??? module-info.java
pom.xml
Run Code Online (Sandbox Code Playgroud)
pom.xml中:
<groupId>org.example</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>10</release>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
当我通过构建项目时mvn -X install -DskipTests=true,它失败了:
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project example: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile failed.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenJDK 15、Spring Boot 2.6.0、Springfox 3 启动 Spring Boot 项目。
我们正在做一个项目,取代Netty作为 Web 服务器并使用 Jetty 来代替,因为我们不需要非阻塞环境。
在代码中我们主要依赖Reactor API(Flux、Mono),所以我们无法删除org.springframework.boot:spring-boot-starter-webflux依赖。
我在一个新项目中复制了我们遇到的问题:https://github.com/jvacaq/spring-fox。
我发现build.gradle文件中的这些行是问题的根源。
compile("org.springframework.boot:spring-boot-starter-web") {
exclude module: "spring-boot-starter-tomcat"
}
compile("org.springframework.boot:spring-boot-starter-jetty")
Run Code Online (Sandbox Code Playgroud)
这是build.gradle文件:
plugins {
id 'org.springframework.boot' version '2.6.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web") {
exclude module: "spring-boot-starter-tomcat"
}
compile("org.springframework.boot:spring-boot-starter-jetty")
implementation 'org.springframework.boot:spring-boot-starter-webflux'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
implementation "io.springfox:springfox-boot-starter:3.0.0" …Run Code Online (Sandbox Code Playgroud) Java 11被宣布为最新的LTS版本.因此,我们正在尝试基于此Java版本启动新服务.
但是,Java 11的基本Docker镜像远大于Java 8的等效镜像:
openjdk:8-jre-alpine:84 MB
openjdk:11-jre-slim:283 MB
(我只考虑每个Java版本的官方OpenJDK和最轻量级的图像.)
更深入的挖掘发现了以下"事物":
的openjdk:11-jre-slim图像使用基本图像debian:sid-slim.这带来了两个问题:
这比60 MB大 alpine:3.8
在Debian的sid版本是不稳定
openjdk-11-jre-headless安装在映像中的包比(运行Docker容器内部)大3倍openjdk8-jre:
openjdk:8-jre-alpine:
Run Code Online (Sandbox Code Playgroud)/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
openjdk:11-jre-slim:
Run Code Online (Sandbox Code Playgroud)# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
更深入地我发现了这种沉重的"根" - 这modules是JDK 的文件:
Run Code Online (Sandbox Code Playgroud)# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
所以,现在问题来了:
为什么alpine不再使用Java 11 slim图像的基本映像?
为什么不稳定的sid版本用于LTS Java图像?
为什么OpenJDK 11的纤薄/无头/ JRE封装与类似的OpenJDK 8封装相比如此之大?
我正在尝试使用JAXB将XML数据反序列化为Java内容树,在解组时验证XML数据:
try {
JAXBContext context = JAXBContext.newInstance("com.acme.foo");
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
FooObject fooObj = (FooObject) unmarshaller.unmarshal(new File("foo.xml"));
} catch (UnmarshalException ex) {
ex.printStackTrace();
} catch (JAXBException ex) {
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
当我使用Java 8构建项目时,它很好,但使用Java 11构建它失败并出现编译错误:
package javax.xml.bind does not exist
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我们目前正在从 Java 8 迁移到 Java 11。但是,升级我们的服务并没有我们预期的那么痛苦。我们基本上只需要更改我们build.gradle文件中的版本号,服务就可以愉快地启动并运行了。我们升级了库以及使用这些库的(微)服务。直到现在都没有问题。
是否需要实际切换到模块?恕我直言,这会产生不必要的成本。任何建议或进一步阅读材料表示赞赏。
澄清一下,如果在不引入模块的情况下使用 Java 9+ 代码有什么后果吗?它可以例如变得与其他代码不兼容吗?
在其他更改中,JDK 11为java.lang.String类引入了6种新方法:
repeat(int)- 重复String的次数与int参数提供的次数相同lines() - 使用Spliterator延迟提供源字符串中的行isBlank() - 指示String是否为空或仅包含空格字符stripLeading() - 从头开始删除空白区域stripTrailing() - 从末端移除空白区域strip() - 从字符串的开头和结尾删除空白区域 特别是,strip()看起来非常相似trim().根据这篇文章, strip*()方法旨在:
String.strip(),String.stripLeading()和String.stripTrailing()方法修剪目标字符串的正面,背面或正面和背面的空白[由Character.isWhiteSpace()确定].
String.trim() JavaDoc声明:
/**
* Returns a string whose value is this string, with any leading and trailing
* whitespace removed.
* ...
*/
Run Code Online (Sandbox Code Playgroud)
这几乎与上面的引用相同.
究竟之间的差别String.trim(),并String.strip()因为Java的11?
我在我的MacBook(High Sierra,Java 11)上使用Eclipse(4.9.0)并且此错误有时显示,如果我在另一个应用程序上,错误会创建一个"堆栈",如截图所示,它每次回到Eclipse并关闭此错误都很烦人.有人可以帮我解决这个问题吗?
java-11 ×10
java ×9
gradle ×2
java-10 ×2
jaxb ×2
alpine-linux ×1
docker ×1
eclipse ×1
java-9 ×1
java-platform-module-system ×1
maven ×1
module-info ×1
spring-boot ×1
springfox ×1
string ×1
strip ×1
trim ×1
windows ×1