39

从Java8升级到Java11

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUxMTcwOTM4Mg%3D%3D&%3Bmid=2247487476&%3Bidx=1&%3Bsn=efb4d869354ddebc05ee1b2e1ca04fa5
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

奇技 · 指南

为什么选择Java11?

容器环境支持,GC等领域的增强,仅通过切换到 Java 11 就有 16% 的改进。

进行了瘦身,更轻量级,安装包体积小。

JDK11 是一个长期支持版。

1

Java11相对于Java8的一些新特性

1.变量类型推断

Var关键字:新版Java引入全新的类型关键字var,用var来定义的变量像python一样不用写具体类型,编译器能根据实际赋值来自动推断变量的类型

2.普通局部变量

bUbI7rJ.jpg!mobile

3.For循环中使用

BNZVbmn.jpg!mobile

4.Var结合泛型

fYzAryv.png!mobile

注意:var不能在类成员变量类型和方法返回值类型使用

5.增强api

6.String 增强

新版本增加了一些更方便的字符串处理的API

F7JFRru.png!mobile

7.集合增强

增加了一些更加方便的创建和复制集合类型的API

● of() @since 9

● copyOf() @since 10

viUr2aE.png!mobile

8.Stream增强

Java 8 中的流已经很强大了,而且只要涉及到 IO,只要涉及到对一系列数据进行操作,都会用到流。

当然了,Java 9对其操作继续增强,这次的改进主要是如何设置停止流的条件上。为此在流的实例上提供了四个方法 takeWhile(Predicate Interface) 、iterate 、ofNullable 和 dropWhile(Predicate Interface)

2

HTTP Client API

新版jdk官方自带httpClient,支持发送同步、异步的http请求

JvERnai.png!mobile

  • 完全支持Linux容器(包括docker)

许多运行在Java虚拟机中的应用程序(包括Apache Spark和Kafka等数据服务以及传统的企业应用程序)都可以在Docker容器中运行。但是在Docker容器中运行Java应用程序一直存在一个问题,那就是在容器中运行JVM程序在设置内存大小和CPU使用率后,会导致应用程序的性能下降。这是因为Java应用程序没有意识到它正在容器中运行。随着Java 10的发布,这个问题总算得以解决,JVM现在可以识别由容器控制组(cgroups)设置的约束。可以在容器中使用内存和CPU约束来直接管理Java应用程序,其中包括:

● 遵守容器中设置的内存限制

● 在容器中设置可用的CPU

● 在容器中设置CPU约束

3

升级过程中遇到的一些问题

1. javax.xml.bind 不存在

Java11 删除了 Java EE modules,其中就包括 java.xml.bind (JAXB)。

启动时警告:

解决方案:手动添加相关依赖

<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>

2. 编译报错

由于JDK11中删除了sum.misc包,编译时会报错:sun.misc.BASE64Encoder、sun.misc.BASE64Decoder找不到类

解决方式:

使用java.util.Base64.Encoderjava.util.Base64.Decoder替换

3.服务启动报错

① JDK11下使用最新的Greenwich版本的eureka默认情况下必定无法启动,日志提示内嵌的Tomcat没法启动

解决方式:加入JAXB依赖

<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>

② JDK9以后的版本,模块化的概念去除了JAXB(默认没有加载),需做接入声明

ui2uiy3.jpg!mobile

解决方式:加入JAXB依赖

<dependency>
   <groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

4

趋势

从Java 11开始,OpenJDK major version的发布间隔差不多是半年,不用全部都要去关注,都是追赶,但是LTS版本,需要去追赶,去升级,Java11就是最新的LTS版本,下一个或者再一下major version,很可能又是一个LTS版本;虽然目前使用Java 8都挺好的,现实是Java 8的一些特性会被往后移植,但是后续版本的特性和优化不会再被集成到Java 8中了。

往期精彩回顾

MongoDB通配符索引

rIfuyy.png!mobile
b6bMBjv.png!mobile

360技术公众号

技术干货|一手资讯|精彩活动

扫码关注我们


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK