首页 > 其他分享 >Docker设置JDK17的JVM启动参数踩坑

Docker设置JDK17的JVM启动参数踩坑

时间:2023-03-13 12:23:50浏览次数:46  
标签:lang java JDK17 base 参数 JVM Docker opens

背景

需求中需要接入腾讯广告的SDK,在编写完代码进行自测时,直接报错,提示

Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass
堆栈信息如下

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @7ce026d3
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)

解决

然后直接在网上搜索了一下这个报错信息,了解到,这是由于 Java中有关反射相关的功能自从 JDK9 就开始进行了限制,因此如果还想继续在JDK9以及更高的版本中使用反射相关的功能,需要添加JVM启动参数, --add-opens java.base/java.lang=ALL-UNNAMED 。目前的项目使用的是JDK17,所以加了这个参数之后,可以直接在IDEA里正常启动项目,如下所示:

image-20230313115155465

由于现在的项目都是用Docker部署的,所以紧接着在DockerFile中添加了这个JVM启动参数,如下所示:

image-20230313115316766

但是Docker在启动项目的时候又报错了

Unrecognized option: --add-opens java.base/java.lang=ALL-UNNAMED
2023-03-13T03:54:39.098594714Z Error: Could not create the Java Virtual Machine.
2023-03-13T03:54:39.098656798Z Error: A fatal exception has occurred. Program will exit.

image-20230313115520005

--add-opens java.base/java.lang=ALL-UNNAMED这个参数JVM竟然识别不出来,什么鬼?

于是接着搜索,终于在一个帖子里找到了答案

image-20230313115826802

原来是因为JVM并不能识别参数中的空格,所以正确的参数应该是:

--add-opens=java.base/java.util=ALL-UNNAMED

使用上面的参数进行设置后,Docker可以正常部署项目了。真的是醉了,真的是,国内的博客一个个都是复制粘贴,就没一个靠谱的。

参考

Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass
hotspot doesn't recognise new jigsaw options passed through _JAVA_OPTIONS

标签:lang,java,JDK17,base,参数,JVM,Docker,opens
From: https://www.cnblogs.com/reecelin/p/17210897.html

相关文章

  • docker安装zookeeper
    1.docker安装zookeeper1.1.下载zookeeper最新版镜像点击查看代码dockersearchzookeeperdockerpullzookeeperdockerimages//查看下载的......
  • docker搭建consul集群
    防止自己忘了,做个笔记。环境为两台主机,ip分别为:  192.168.2.9,192.168.2.7首先在 192.168.2.9上执行一下命令:dockerrun-d--nameconsul1--net=host-eCONSUL......
  • [docker] 腾讯云启用 mysql 容器
    dockerrun-itd--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456mysql:5.7参数说明:-p3306:3306:映射容器服务的3306端口到宿主机的3306端口,外部主机可......
  • 【磁盘空间不足问题解决】Docker 日志清理、
    问题描述:1、系统无法访问,提示“无法访问此网站”2、启动Docker镜像提示错误信息,如下:“Errorresponsefromdaemon:Cannotrestartcontainer7f812bfba45f:write/v......
  • Docker CLI docker buildx prune常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Doc......
  • docker
    docker的安装方法:1、脚本安装方法(最新版)curl-sSLhttps://get.docker.com/|sh2、yum安装3、rpm包安装所有的:https://download.docker.com/centos7.6的:http://dock......
  • JVM调优
    参考文档;java3y《对线面试官》 一般来说的优化顺序通常是关系型数据库先到瓶颈,首先排查数据库问题索引、语句、是否引入分布式缓存、是否需要分库分表等然后......
  • jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息
    jvm配置+OmitStackTraceInFastThrow导致不打印日志具体信息参考https://blog.51cto.com/u_15246373/5363973最后查到该问题的解决方法有三种1、查询历史日志,如果日志......
  • Docker Compose部署Nexus3时的docker-compose.yml代码
    场景在上面实现基本的Compose的操作的基础上,实现使用DockerCompose搭建Nexus3。注:关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现version:'3'ser......
  • docker run mssql
    拉取镜像dockerpullmcr.microsoft.com/mssql/server:2019-latest创建挂载目录mkdir/data/mssql为挂载目录设置写入权限chmod-R777/data/mssql运行容......