乐趣区

关于java:JDK-从老版本升级到-18的问题总结

JDK8 降级常见问题

JDK8 公布很久了,它提供了许多吸引人的新个性,可能进步编程效率。

如果是新的我的项目,应用 JDK8 当然是最好的抉择。然而,对于一些老的我的项目,降级到 JDK8 则存在一些兼容性问题,是否降级须要酌情思考。

近期,我在工作中遇到一个工作,将部门所有我的项目的 JDK 版本升级到 1.8(老版本大多是 1.6)。在这个过程中,遇到一些问题点,并联合在网上看到的坑,在这里总结一下。

Intellij 中的 JDK 环境设置

Settings

点击 File > Settings > Java Compiler

Project bytecode version 抉择 1.8

点击 File > Settings > Build Tools > Maven > Importing

抉择 JDK for importer 为 1.8

Projcet Settings

Project SDK 抉择 1.8

Application

如果 web 利用的启动形式为 Application,须要批改 JRE

点击 Run/Debug Configurations > Configuration

抉择 JRE 为 1.8

Linux 环境批改

批改环境变量

批改 /etc/profile 中的 JAVA_HOME,设置 为 jdk8 所在门路。

批改后,执行 source /etc/profile 失效。

查看环境变量是否增加胜利测试:

echo $JAVA_HOME

编译、公布脚本中如果有 export JAVA_HOME,须要留神,须要应用 jdk8 的门路。

批改 maven

settings.xml 中 profile 的激活条件如果是 jdk,须要批改一下 jdk 版本

<activation>
  <jdk>1.8</jdk> <!-- 批改为 1.8 -->
</activation>

批改 server

批改 server 中的 javac 版本,以 resin 为例:

批改 resin 配置文件中的 javac 参数。

<javac compiler="internal" args="-source 1.8"/>

sun.* 包缺失问题

JDK8 不再提供 sun.* 包供开发者应用,因为这些接口不是公共接口,不能保障在所有 Java 兼容的平台上工作。

应用了这些 API 的程序如果要降级到 JDK 1.8 须要寻求代替计划。

尽管,也能够本人导入蕴含 sun.* 接口 jar 包到 classpath 目录,但这不是一个好的做法。

须要具体理解为什么不要应用 sun.*,能够参考官网文档:Why Developers Should Not Write Programs That Call ‘sun’ Packages

默认安全策略批改

降级后预计有些小伙伴在应用不平安算法时可能会产生谬误,so,反对不平安算法还是有必要的

找到 \$JAVA_HOME 下 jre/lib/security/java.security,将禁用的算法设置为空:jdk.certpath.disabledAlgorithms=

JVM 参数调整

在 jdk8 中,PermSize 相干的参数曾经不被应用:

-XX:MaxPermSize=size

Sets the maximum permanent generation space size (in bytes). This option was deprecated in JDK 8, and superseded by the -XX:MaxMetaspaceSize option.

-XX:PermSize=size

Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded. This option was deprecated un JDK 8, and superseded by the -XX:MetaspaceSize option.

JDK8 中再也没有 PermGen 了。其中的某些局部,如被 intern 的字符串,在 JDK7 中曾经移到了一般堆里。其余构造在 JDK8 中会被移到称作“Metaspace”的本机内存区中,该区域在默认状况下会主动成长,也会被垃圾回收。它有两个标记:MetaspaceSize 和 MaxMetaspaceSize。

-XX:MetaspaceSize=size

Sets the size of the allocated class metadata space that will trigger a garbage collection the first time it is exceeded. This threshold for a garbage collection is increased or decreased depending on the amount of metadata used. The default size depends on the platform.

-XX:MaxMetaspaceSize=size

Sets the maximum amount of native memory that can be allocated for class metadata. By default, the size is not limited. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system.

以下示例显示如何将类类元数据的下限设置为 256 MB:

XX:MaxMetaspaceSize=256m

字节码问题

ASM 5.0 beta 开始反对 JDK8

字节码谬误

Caused by: java.io.IOException: invalid constant type: 15
    at javassist.bytecode.ConstPool.readOne(ConstPool.java:1113)
  • 查找组件用到了 mvel,mvel 为了提高效率进行了字节码优化,正好碰上 JDK8 死穴,所以须要降级。
<dependency>
  <groupId>org.mvel</groupId>
  <artifactId>mvel2</artifactId>
  <version>2.2.7.Final</version>
</dependency>
  • javassist
<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.18.1-GA</version>
</dependency>

留神

有些部署工具不会删除旧版本 jar 包,所以能够尝试手动删除老版本 jar 包。

http://asm.ow2.org/history.html

Java 连贯 redis 启动报错 Error redis clients jedis HostAndPort cant resolve localhost address

谬误环境:
本地 window 开发环境没有问题。上到 Linux 环境, 启动呈现问题。
错误信息:
Error redis clients jedis HostAndPort cant resolve localhost address

解决办法:

(1)查看 Linux 零碎的主机名

# hostname
template

(2)查看 /etc/hosts 文件中是否有 127.0.0.1 对应主机名,如果没有则增加

Resin 容器指定 JDK 1.8

如果 resin 容器原来版本低于 JDK1.8,运行 JDK 1.8 编译的 web app 时,可能会提醒谬误:

java.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0

解决办法就是,应用 JDK 1.8 要从新编译一下。而后,我在部署时呈现过编译后仍报错的状况,重启一下服务器后,问题解决

./configure --prefix=/usr/local/resin  --with-java=/usr/local/jdk1.8.0_121
make & make install

参考资料

  • java8-tutorial
  • Compatibility Guide for JDK 8
  • Compatibility Guide for JDK 8 中文翻译

关注公众号:java 宝典

退出移动版