• [技术干货] 定时任务之------- JDK ScheduledExecutorService
    ScheduledExecutorService 是 JDK 中用于执行定时任务的工具,它可以帮助我们实现各种定时任务,如每隔一段时间执行某个任务,或在指定时间执行某个任务等。 在使用 ScheduledExecutorService 之前,我们需要先创建一个 ScheduledExecutorService 对象,通过 Executors 工具类提供的 newScheduledThreadPool 方法来创建。以下是一个创建 ScheduledExecutorService 的示例代码: ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 其中参数 1 表示创建一个线程池,线程数量为 1。 接下来,我们可以使用 schedule 方法来执行定时任务。schedule 方法有两个重载方法,分别为: ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit); ScheduledFuture<?> schedule(Callable<V> callable, long delay, TimeUnit unit); 第一个方法接受一个 Runnable 类型的任务,表示需要执行的操作;第二个方法接受一个 Callable 类型的任务,表示需要执行的操作,并且可以返回一个结果。 例如,我们想要在 5 秒后执行一个任务,可以使用以下代码: executor.schedule(() -> { // 执行具体的任务逻辑 }, 5, TimeUnit.SECONDS); 这里使用了 Lambda 表达式来定义 Runnable 对象。 除了 schedule 方法以外,还有 scheduleAtFixedRate 和 scheduleWithFixedDelay 方法可以用来执行重复的定时任务。这两个方法都接受三个参数:任务、初始延迟时间和重复间隔时间。 scheduleAtFixedRate 方法会以一定的频率执行任务,无论任务是否已经完成。例如,我们想要每隔 1 秒钟执行一个任务,可以使用以下代码: executor.scheduleAtFixedRate(() -> { // 执行具体的任务逻辑 }, 0, 1, TimeUnit.SECONDS); 这里的第二个参数为 0 表示任务初始不需要延迟,第三个参数为 1 表示每隔 1 秒钟执行一次。 scheduleWithFixedDelay 方法会在任务完成后再等待一段时间再执行下一次任务。例如,我们想要每 5 秒钟执行一个任务,可以使用以下代码: executor.scheduleWithFixedDelay(() -> { // 执行具体的任务逻辑 }, 0, 5, TimeUnit.SECONDS);  这里的第二个参数为 0 表示任务初始不需要延迟,第三个参数为 5 表示任务执行完成后等待 5 秒钟再执行下一次任务。 当我们不再需要执行定时任务时,需要调用 ScheduledExecutorService 的 shutdown 方法来关闭 ScheduledExecutorService 对象,以释放资源。 
  • [技术干货] JDK8 Stream 操作
    JDK 8引入了Stream API,它提供了一种用于处理集合对象的函数式编程方式。Stream可以使代码更短,更易读,并且可以利用多核CPU进行并行处理。以下是几个常见的JDK8 Stream操作:过滤使用filter()方法可以过滤Stream中的元素。例如,以下代码片段将从整数列表中选择所有大于10的数字: java复制代码List<Integer> numbers = Arrays.asList(1, 2, 3, 10, 11, 12); List<Integer> result = numbers.stream().filter(n -> n > 10).collect(Collectors.toList()); 映射使用map()方法可以映射Stream中的元素。例如,以下代码片段将字符串列表中的每个字符串转换为大写: java复制代码List<String> strings = Arrays.asList("hello", "world"); List<String> result = strings.stream().map(s -> s.toUpperCase()).collect(Collectors.toList()); 排序使用sorted()方法可以对Stream中的元素进行排序。例如,以下代码片段将整数列表按升序排列: java复制代码List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9); List<Integer> result = numbers.stream().sorted().collect(Collectors.toList()); 去重使用distinct()方法可以从Stream中删除重复的元素。例如,以下代码片段将整数列表中的重复项删除: java复制代码List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 1, 4, 5); List<Integer> result = numbers.stream().distinct().collect(Collectors.toList()); 分组使用Collectors.groupingBy()方法可以对Stream中的元素进行分组。例如,以下代码片段将字符串列表中的字符串按长度分组: java复制代码List<String> strings = Arrays.asList("hello", "world", "apple", "banana"); Map<Integer, List<String>> result = strings.stream().collect(Collectors.groupingBy(s -> s.length())); 这些是JDK8 Stream操作中的一些常见用法,您可以根据自己的需求进行修改或组合。
  • [技术干货] Oracle JDK 和 OpenJDK有什么区别?
    可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异?下面我通过收集到的一些资料,为你解答这个被很多人忽视的问题。对于 Java 7,没什么关键的地方。OpenJDK 项目主要基于 Sun 捐赠的 HotSpot 源代码。此外,OpenJDK 被选为 Java 7 的参考实现,由 Oracle 工程师维护。关于 JVM,JDK,JRE 和 OpenJDK 之间的区别,Oracle 博客帖子在 2012 年有一个更详细的答案:问:OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?答:非常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了几个部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 的实现,以及一些闭源的第三方组件,如图形光栅化器,一些开源的第三方组件,如 Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源 Oracle JDK 的所有部分,除了我们考虑商业功能的部分。总结:(提示:下面括号内的内容是基于原文补充说明的,因为原文太过于晦涩难懂,用人话重新解释了下,如果你看得懂里面的术语,可以忽略括号解释的内容)Oracle JDK 大概每 6 个月发一次主要版本(从 2014 年 3 月 JDK 8 LTS 发布到 2017 年 9 月 JDK 9 发布经历了长达 3 年多的时间,所以并不总是 6 个月),而 OpenJDK 版本大概每三个月发布一次。但这不是固定的,我觉得了解这个没啥用处。详情参见:https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence 。OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;(个人观点:众所周知,JDK 原来是 SUN 公司开发的,后来 SUN 公司又卖给了 Oracle 公司,Oracle 公司以 Oracle 数据库而著名,而 Oracle 数据库又是闭源的,这个时候 Oracle 公司就不想完全开源了,但是原来的 SUN 公司又把 JDK 给开源了,如果这个时候 Oracle 收购回来之后就把他给闭源,必然会引起很多 Java 开发者的不满,导致大家对 Java 失去信心,那 Oracle 公司收购回来不就把 Java 烂在手里了吗!然后,Oracle 公司就想了个骚操作,这样吧,我把一部分核心代码开源出来给你们玩,并且我要和你们自己搞的 JDK 区分下,你们叫 OpenJDK,我叫 Oracle JDK,我发布我的,你们继续玩你们的,要是你们搞出来什么好玩的东西,我后续发布 Oracle JDK 也会拿来用一下,一举两得!)OpenJDK 开源项目:https://github.com/openjdk/jdkOracle JDK 比 OpenJDK 更稳定(肯定啦,Oracle JDK 由 Oracle 内部团队进行单独研发的,而且发布时间比 OpenJDK 更长,质量更有保障)。OpenJDK 和 Oracle JDK 的代码几乎相同(OpenJDK 的代码是从 Oracle JDK 代码派生出来的,可以理解为在 Oracle JDK 分支上拉了一条新的分支叫 OpenJDK,所以大部分代码相同),但 Oracle JDK 有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用 OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问题;在响应性和 JVM 性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能。Oracle JDK 不会为即将发布的版本提供长期支持(如果是 LTS 长期支持版本的话也会,比如 JDK 8,但并不是每个版本都是 LTS 版本),用户每次都必须通过更新到最新版本获得支持来获取最新版本。Oracle JDK 使用 BCL/OTN 协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可。既然 Oracle JDK 这么好,那为什么还要有 OpenJDK?答:OpenJDK 是开源的,开源意味着你可以对它根据你自己的需要进行修改、优化,比如 Alibaba 基于 OpenJDK 开发了 Dragonwell8:https://github.com/alibaba/dragonwell8OpenJDK 是商业免费的(这也是为什么通过 yum 包管理器上默认安装的 JDK 是 OpenJDK 而不是 Oracle JDK)。虽然 Oracle JDK 也是商业免费(比如 JDK 8),但并不是所有版本都是免费的。OpenJDK 更新频率更快。Oracle JDK 一般是每 6 个月发布一个新版本,而 OpenJDK 一般是每 3 个月发布一个新版本。(现在你知道为啥 Oracle JDK 更稳定了吧,先在 OpenJDK 试试水,把大部分问题都解决掉了才在 Oracle JDK 上发布)基于以上这些原因,OpenJDK 还是有存在的必要的!转载自https://www.duidaima.com/Group/Topic/JAVA/10403
  • [其他] windows中jdk环境变量设置自动化脚本
    start.bat@echo offset regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment rem LPYecho.echo ************************************************************echo * *echo * JDK 系统环境变量设置 *echo * *echo ************************************************************echo.echo === 准备设置环境变量: JAVA_HOME=%javahome%echo === 注意: 如果JAVA_HOME存在,会被覆盖,此操作不可逆的,请仔细检查确认!! ===echo.echo === 准备设置环境变量(前面有个.): CLASS_PATH=.;%%JAVA_HOME%%\lib\tools.jar;%%JAVA_HOME%%\lib\dt.jar;.echo === 注意: 如果CLASS_PATH存在,会被覆盖,此操作不可逆的,请仔细检查确认!! ===echo.echo === 准备设置环境变量: PATH=%%JAVA_HOME%%\binecho === 注意: PATH会追加在最后面,echo.set /P EN=请确认后按 回车键 开始设置!echo.echo.set javahome=%~dp0%echo === 新创建环境变量 JAVA_HOME=%javahome%setx "JAVA_HOME" /m "%javahome%echo.echo. echo === 新创建环境变量 CLASS_PATH=%%JAVA_HOME%%\lib\tools.jar;%%JAVA_HOME%%\lib\dt.jar;.setx "CLASS_PATH" ".;%%JAVA_HOME%%\lib\tools.jar;%%JAVA_HOME%%\lib\dt.jar;" -m echo.echo. echo === 新追加环境变量(追加到最后面) PATH=;%%JAVA_HOME%%\bin;%%JAVA_HOME%%\jre\bin;set append=;%%JAVA_HOME%%\bin;%%JAVA_HOME%%\jre\bin;set newPath=%Path%%append%setx "Path" "%newPath%" -mecho.echo.echo === 请按任意键退出! pause>nul将start.bat放到jdk根目录下,然后鼠标右键用管理员方式运行,再按enter键开始自动设置JAVA_HOME
  • [Java] arm64 平台openjdk-14 在哪里可以获取到?
    arm平台ubuntu系统 openjdk 从哪里可以获取到?
  • [毕昇JDK] Bisheng JDK 17 较高概率发生性能下降 30%
    环境鲲鹏 920 128 核Bisheng JDK 17.0.1 / 17.0.4运行 BenchmarkSQL + ShardingSphere-JDBC网卡队列绑核 0-15,BenchmarkSQL 绑核 16-127。现象概率性出现运行 BenchmarkSQL us 较高(几乎压满 CPU 核),sy 较低。之前使用的是 GraalVM EE,本来以为是 GraalVM EE 才有的现象,后续测试发现使用 Bisheng JDK 17 也有相似现象。多次启动 BenchmarkSQL 进程,性能时好时坏。正常情况下,使用 BenchmarkSQL + ShardingSphere-JDBC 性能可以达到 200 万 tpmC 以上。最近启动进程时有较高概率发生性能异常,性能相比正常情况下降约 30%。Bisheng JDK 17 现象正常情况us 相对较低,网卡中断几乎跑满前 16 核。正常情况下 tpmC 在 200 万左右。异常现象最近测试发现,经常出现 us 较高,中断相比性能正常时更低。tpmC 在 160 万左右。性能下降至正常的 70% 左右。升级 Bisheng JDK 17.0.4 问题未解决async-profiler 采样对比正常情况与异常情况的采样,表面现象为计算开销增加,在代码路径上没有看出其他异常。 GraalVM EE 现象偶发现象:CPU us 特别高,sy 较低。退出压测进程重新运行后现象消失。6 节点测试中,该现象频繁出现GraalVM 发生该现象时对性能影响非常明显,tpmC 相比正常几乎减半。
  • [热门活动] 开源实习 | 毕昇JDK发布国密算法实习任务
    开源实习是欧拉开源社区针对高校学生推出的线上实习,让学生在真正的开源环境中提升实践能力,深度参与开源社区贡献。访问实习官网了解详情:cid:link_5毕昇JDK基于OpenJDK开发,是一款高性能、可用于生产环境的OpenJDK发行版。BGMProvider是为毕昇JDK生态提供国密TLS协议Java实现,它包括 jca、jsse、tomcat-adaptor等模块。目前BGMProvider jca模块实现的国密相关算法依赖于bouncycastle。为了将来更好地扩展,需要将BGMProvider和bouncycastle解耦,并且在BGMProvider上实现国密相关算法。基于上述背景,毕昇JDK发布了4个实习任务,欢迎在校学生积极申请参与(可以选择申请国密算法实习任务中的一个或多个)。✦ 实习任务 ✦一、在BGMProvider中使用Java实现SM4分组密码算法【需求描述】使用Java语言实现SM4分组密码算法;实现SM4算法的功能测试用例;【产出标准】实现SM4算法功能测试用例,确保测试用例覆盖场景完全;保证原本BGMProvider提供的测试用例通过;符合Java语言的代码规范;【任务链接】cid:link_1二、在BGMProvider中使用Java实现SM3withSM2数字签名算法【需求描述】使用Java语言实现SM3withSM2数字签名算法;实现SM3withSM2算法的功能测试用例;【产出标准】实现的SM3withSM2算法功能测试用例,确保测试用例覆盖场景完全;保证原本BGMProvider提供的测试用例通过;符合Java语言的代码规范;【任务链接】cid:link_2三、在BGMProvider中使用Java实现SM3/HmacSM3国密算法【需求描述】使用Java语言实现SM3密码杂凑算法,并且编写功能测试用例;使用Java语言实现HmacSM3算法,并且编写功能测试用例;【产出标准】实现SM3功能测试用例,确保测试用例覆盖场景完全;实现HmacSM3功能测试用例,确保测试用例覆盖场景完全;保证原本BGMProvider提供的测试用例通过;符合Java语言的代码规范;【任务链接】cid:link_3四、在BGMProvider中使用Java实现SM2公钥加密算法【需求描述】使用Java语言实现SM2公钥加密算法;实现SM2算法的功能测试用例;【产出标准】实现SM2算法功能测试用例,确保测试用例覆盖场景完全;保证原本BGMProvider提供的测试用例通过;符合Java语言的代码规范;【任务链接】cid:link_4单击此处查看Compiler SIG 7月份发布的实习任务✦ 实习时间 ✦开源实习将在社区长期进行,实习申请通过后即可开始实习,实习协议期为6个月,期间时间可自由分配,满60个实习积分并获得导师认可后即可获得实习证明。✦ 报名资格 ✦年满18周岁高校学生,无专业年级限制。平均每周能投入10小时以上的时间。请移步实习官网查看报名步骤。✦ Compiler SIG 介绍 ✦Compiler SIG 专注于编译器领域技术交流探讨和分享,包括 GCC/LLVM/OpenJDK 以及其他的程序优化技术,聚集编译技术领域的学者、专家、学术等同行,共同推进编译相关技术的发展。扫码添加 SIG 小助手微信,邀请你进 Compiler SIG 微信交流群。
  • [问题求助] 【鲲鹏性能分析插件】【java性能分析】在kylinv10/毕昇jdk1.8上无法使用采样分析
    【功能模块】java性能【操作步骤&问题现象】1、安装毕昇jdk1.8 2、安装maven3.8.63、本地启动jar包4、登陆鲲鹏性能分析页面5、点击java性能分析6、点击采样分析【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] UOS系统安装 毕昇JDK和GCC for OpenEuler
    第一步:获取软件包https://support.huaweicloud.com/ug-hgcc-kunpengdevps/kunpenghgcc_06_0004.htmlhttps://www.hikunpeng.com/developer/devkit/compiler/jdk第二步:上传到软件包到home目录下毕昇JDK安装将 bisheng ----.tar.gz 压缩包解压缩第三步:配置环境变量vi /etc/profileexport JAVA_HOME=/home/bisheng-jdk-17.0.2export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar第四步:使环境变量生效source /etc/profile第五步:查看安装结果Java -versionGCC for OpenEule安装第六步:创建GCC for openEuler安装目录mkdir -p /opt/aarch64/compiler 第七步:将GCC for openEuler压缩包拷贝到安装目录下cp -rf gcc-10.3.1-2021.09-aarch64-linux.tar.gz /opt/aarch64/compiler第八步:将 gcc ----.tar.gz 压缩包解压缩第九步配置环境变量export PATH=/opt/aarch64/compiler/gcc-10.3.1-2021.09-aarch64-linux/bin:$PATH export INCLUDE=/opt/aarch64/compiler/gcc-10.3.1-2021.09-aarch64-linux/include:$INCLUDE export LD_LIBRARY_PATH=/opt/aarch64/compiler/gcc-10.3.1-2021.09-aarch64-linux/lib64:$LD_LIBRARY_PATH第十步:使环境变量生效source /etc/profile最后查看安装结果 
  • [毕昇JDK] 【最新动态】毕昇 JDK 登陆 Eclipse Adoptium 开源 JDK 发行版市场
    毕昇 JDK[1] 作为高质量企业级的开源 JDK 发行版,被 openEuler 和业界 Java 用户广泛使用,它的兼容性和质量也受到了 Eclipse Adoptium 工作组的认可,于2022年05月26日成功登陆 Eclipse Adoptium 开源 JDK 发行版市场。最近,世界上最大的开源软件基金会之一的 Eclipse 基金会宣布推出 Adoptium Marketplace[2]。通过这个平台,Eclipse 基金会和 Adoptium 工作组为数以百万计的开发者、研究人员和其他组织提供了一个简单的途径,以确保高性能、企业级、跨平台、经过 AQAvit 验证(Adoptium Quality Assurance)和 Java TCK 认证(Technology Compatibility Kit)的开源 JDK 发行版在整个 Java 生态系统中普遍使用。“随着 OpenJDK 发行版数量和多样性的不断增加,必须建立一个具备高质量、一致性的生态系统。Adoptium Marketplace 的创建为 Java 生态系统提供了一个厂商中立的平台,使任何人都可以容易地获得与 Java SE 标准兼容的开源 JDK 发行版,这些发行版已经通过广泛的测试,可以用于各种环境的企业级部署。” Eclipse 基金会执行董事 Mike Milinkovich 说。Eclipse Adoptium 工作组由许多 Java 开发者和发行版厂商共同发起成立,如华为、阿里云、微软、Azul、IBM、iJUG、Karakun AG、New Relic 和 Red Hat,为 Java 生态系统提供了完全兼容的、基于 OpenJDK 源代码的高质量 JDK 发行版。任何从 Adoptium Marketplace 选择 JDK 发行版的人都可以获得以下好处:发行版已通过了相关版本的 Java SE TCK 测试,以确保 Java 的兼容性;发行版已使用 AQAvit 测试标准进行了全面的验证,通过了多项测试以确保其符合 Java 行业质量标准;发行版的 AQAvit 质量测试结果向公众公开。华为毕昇 JDK 高级项目经理陈善瑶说:"华为毕昇(JDK 8)是一个开源的高性能 OpenJDK 发行版,可用于生产环境,并针对 ARM 架构进行了性能优化和稳定性增强。感谢 Adoptium 工作组为用户建立了一个优秀的 JDK 发行版市场,让用户获得高质量的开源发行版,华为毕昇(JDK 8)很荣幸成为其中的一员!"Eclipse官方通告如下:https://newsroom.eclipse.org/news/announcements/oss-leader-eclipse-foundation-and-adoptium-working-group-launch-adoptium[1] https://www.openeuler.org/zh/other/projects/bishengjdk/[2] https://adoptium.net/marketplace/?version=8如果遇到相关技术问题(包括不限于毕昇 JDK),可以通过 Compiler SIG 求助。Compiler SIG 每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM 和 JDK 等相关编译技术,感兴趣的同学可以添加如下微信小助手入群。原文转载自 毕昇编译-毕昇 JDK 登陆 Eclipse Adoptium 开源 JDK 发行版市场
  • [毕昇JDK] 【案例分享】宝兰德 BES 在 BGMProvider 国密库上的实践
    > 编者按:本文主要介绍毕昇JDK BGMProvider(GMTLS Java版本实现)、国密协议、宝兰德BES中间件通过BGMProvider国密库实现国密通信相关知识和一些实践。 ## 背景知识 ### BGMProvider BGMProvider是毕昇JDK团队在OpenEuler开源社区下的一个开源项目,开源地址:https://gitee.com/openeuler/BGMProvider ,BGMProvider是为了在JDK原有的TLS加密通信中支持国密TLS而开发的项目, 目标是提供一个完整的GMTLS JAVA实现,主要有以下特性: 1. 支持国密标准中特有的SM2非对称加密算法/SM3密码杂凑算法/SM4对称加密算法,国密SSLSocket/SSLEngine中的握手协议以及加密通信流程 2. 基于 Java Cryptography Architecture(JCA) 框架, 提供一个JCE provider [1](#refer-anchor)和 JSSE provider[2](#refer-anchor) jce架构如下: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468046670793226.png) jsse架构如下: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468060129504975.png) 3. 支持的中间件 Tomcat: 8.5.2及以上,9.0.1及以上,10.0.0及以上 Spring boot: 2.5.8及以上 Netty: 4.1.7.1.Final及以上 BES: 9.5及以上版本 4. 版本节奏 每个季度一个版本,即3.30、6.30、9.30、12.30(中间可能会出临时版本) ### 宝兰德BES 宝兰德BES应用服务器是一款JavaEE应用服务器,支持最新的JavaEE规范标准,如EJB3.2、Servlet3.1、JSP 2.3、JSTL 1.2、JSF 2.2、JavaMail 1.5、JMS 2.0等。从大的功能来讲BES应用服务器功能主要包括: > 1) 卓越的Web、EJB和JMS。 > 2) 集中的中央全系统可视化管理。 > 3) 方便实用的日志查看和功能模块监控。 ### 国密算法 国密算法指的是**SM2/SM3/SM4**等算法,其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。 - SM2为基于椭圆曲线密码的公钥密码算法标准,包含数字签名、密钥交换和公钥加密,用于替换RSA/Diffie-Hellman/ECDSA/ECDH等国际算法; - SM3[3](#refer-anchor)为密码哈希算法,用于替代MD5/SHA-1/SHA-256等国际算法; - SM4为分组密码,用于替代DES/AES等国际算法; ### 国密证书 国密证书是使用国密算法进行公钥签名和HASH运算,并采用国密密钥封装的证书。国密证书同样符合X.509等国际标准证书规范。在国内很多政企应用场景中,经常会使用“双国密证书”架构,即每个服务同时部署两套证书:签名证书和加密证书。签名证书代表该节点身份,用于身份认证和对数据签名;加密证书用于交换密钥和对数据加密。 ### 国密SSL协议 国密SSL协议是符合国密标准*GM/T0024-2014* [4](#refer-anchor)和*GB/T38636-2020* [5](#refer-anchor)的安全传输协议,类似于国际SSL/TLS,国密SSL协议实际落地,需要国密证书、国密Web服务器、国密浏览器等互相配合。 ### 标准SSL与国密SSL自适应 国密SSL可同时兼容标准SSL,在同一个服务端口中,自适应来自不同客户端标准SSL通信和国密SSL通信,解决从标准SSL到国密SSL的平滑过度。 下面主要介绍宝兰德BES应用服务器如何通过毕昇JDK的BGMProvider来实现web服务的国密SSL通信。 ## BGMProvider基本使用 ### maven下载安装 可以通过maven坐标直接依赖编译好的库,目前最新版本是1.0.3.2: ```xml <dependency> <groupId>org.openeuler</groupId> <artifactId>bgmProvider</artifactId> <version>1.0.3.2</version> </dependency> ``` ### 源码编译安装 编译要求: 8u302+, 11.0.11+,执行下面命令即可: ```shell $ git clone https://gitee.com/openeuler/BGMProvider.git $ cd BGMProvider $ mvn package ``` 编译完成之后,目录结构如下: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468181882983885.png) - bgmprovider模块 将jca和jsse注册的算法组合成BGMProvider,在使用GMTLS时,只需要配置BGMProvider即可 - jca模块 支持国密标准中特有的SM2非对称加密算法/SM3密码杂凑算法/SM4对称加密算法 - jsse模块 支持国密SSLSocket/SSLEngine中的握手协议以及加密通信流程 - tomcat-adaptor模块 用于在Tomcat中支持国密TLS 将target目录下的jsse-xxxx.jar, jca-xxxx.jar, bgmprovider-xxxx.jar三个jar包(或bgmprovider-xxxx-jar-with-dependencies.jar一个jar包)拷贝至CLASSPATH目录即可。 如果在tomcat中使用,则还需要将tomcat-adaptor-xxxx.jar拷贝至$TOMCAT_HOME/lib。 ### 配置方式 方式一:修改JDK配置文件,直接集成到JDK当中 修改path_to_jre/lib/security/java.security文件,添加BGMProvider。 ```properties security.provider.1=org.openeuler.BGMProvider security.provider.2=sun.security.provider.Sun security.provider.3=sun.security.rsa.SunRsaSign security.provider.4=sun.security.ec.SunEC security.provider.5=com.sun.net.ssl.internal.ssl.Provider security.provider.6=... ... ``` 方式二: 使用Security API 添加BGMProvider ,并设置其优先级。 例:设置BGMProvider为最高优先级 ```java Security.insertProviderAt(new BGMProvider(), 1); ``` ### 使用国密算法 下面案例使用SM3算法计算字符串摘要信息: ```java import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.Security; public class SM3Test { private static String plainText = "hello sm3"; public static void main(String[] args) throws Exception { // 使用Security API 添加BGMProvider //Security.insertProviderAt(new org.openeuler.BGMJCEProvider(), 1); MessageDigest md = MessageDigest.getInstance("SM3"); md.update(plainText.getBytes(StandardCharsets.UTF_8)); byte[] res = md.digest(); System.out.println(new String(res)); } } ``` 如没有使用BGMProvider,执行上述代码会出现如下SM3算法无法找到的异常: ```java Exception in thread "main" java.security.NoSuchAlgorithmException: SM3 MessageDigest not available at sun.security.jca.GetInstance.getInstance(GetInstance.java:159) at java.security.Security.getImpl(Security.java:697) at java.security.MessageDigest.getInstance(MessageDigest.java:170) at com.bes.enterprise.gmssl.adaptor.SM3Test.main(SM3Test.java:12) ``` ## BES中使用BGMProvider开启GMTLS ### 国密证书 根据国密标准,GMTLS是双证书体系,且必须使用国密算法,正式的网站可以通过*cfca* [6](#refer-anchor)官网去申请国密证书,为了测试,我们可以通过keytool工具生成国密证书(需要在JDK中配置国密库,可参考BGMProvider的配置方式[7](#refer-anchor)),具体生成过程如下: ```shell ############# CA根证书制作 ############# # 生成CA密钥 keytool -genkey -keyalg SM2 -sigalg SM3withSM2 -keysize 256 -ext KeyUsage=DigitalSignature,nonRepudiation,keyCertSign,crlSign -ext BasicConstraints=CA:true -keystore server-rootca.p12 -storepass changeit -keypass changeit -storetype pkcs12 -alias server-rootca -dname "CN=server-rootca" -validity 3650 -storetype pkcs12 # 导出CA根证书 keytool -exportcert -keystore server-rootca.p12 -alias server-rootca -file server-rootca.crt -storepass changeit -trustcacerts -storetype pkcs12 # 导入CA根证书到%JAVA_HOME%/jre/lib/security/cacerts信任库 keytool -import -alias server-rootca -file server-rootca.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit -trustcacerts -noprompt ############# SM2签名证书制作 ############# # 生成SM2签名密钥 keytool -genkey -keyalg SM2 -sigalg SM3withSM2 -keysize 256 -ext KeyUsage=digitalSignature -ext SubjectAlternativeName=dns:localhost,ip:127.0.0.1 -keystore server-sm2.p12 -storepass changeit -keypass changeit -storetype pkcs12 -alias server-sm2-sig -dname "CN=server/sm2/sig" -validity 3650 -storetype pkcs12 # 生成SM2签名证书请求 keytool -certreq -alias server-sm2-sig -sigAlg SM3withSM2 -keystore server-sm2.p12 -file server-sm2-sig.csr -storepass changeit -storetype pkcs12 # 使用CA根证书制作SM2签名证书 keytool -gencert -ext KeyUsage=digitalSignature -ext SubjectAlternativeName=dns:localhost,ip:127.0.0.1 -sigalg SM3withSM2 -alias server-rootca -keystore server-rootca.p12 -infile server-sm2-sig.csr -outfile server-sm2-sig.crt -storepass changeit -validity 3650 -storetype pkcs12 # 将SM2签名证书导入密钥库 keytool -import -alias server-sm2-sig -file server-sm2-sig.crt -keystore server-sm2.p12 -trustcacerts -storepass changeit -trustcacerts -storetype pkcs12 ############# SM2加密证书制作 ############# # 生成SM2加密密钥 keytool -genkey -keyalg SM2 -sigalg SM3withSM2 -keysize 256 -ext KeyUsage=keyEncipherment,dataEncipherment,keyAgreement -ext SubjectAlternativeName=dns:localhost,ip:127.0.0.1 -keystore server-sm2.p12 -storepass changeit -keypass changeit -storetype pkcs12 -alias server-sm2-enc -dname "CN=server/sm2/enc" -validity 3650 -storetype pkcs12 # 生成SM2加密证书请求 keytool -certreq -alias server-sm2-enc -sigAlg SM3withSM2 -keystore server-sm2.p12 -file server-sm2-enc.csr -storepass changeit -storetype pkcs12 # 使用CA根证书制作SM2加密证书 keytool -gencert -ext KeyUsage=keyEncipherment,dataEncipherment,keyAgreement -ext SubjectAlternativeName=dns:localhost,ip:127.0.0.1 -sigalg SM3withSM2 -alias server-rootca -keystore server-rootca.p12 -infile server-sm2-enc.csr -outfile server-sm2-enc.crt -storepass changeit -validity 3650 -storetype pkcs12 # 将SM2加密证书导入密钥库 keytool -import -alias server-sm2-enc -file server-sm2-enc.crt -keystore server-sm2.p12 -trustcacerts -storepass changeit -trustcacerts -storetype pkcs12 ``` 证书制作完成之后,我们只需要用到server-sm2.p12这一个密钥库即可。 ### BES上配置GMTLS #### BES安装和启动 这里我们选择毕昇JDK8u302和BES9.5版本,以下是一些简单的安装和启动过程: - 毕昇JDK安装 ```shell # 下载毕昇JDK,选择对应的平台,版本8u302+ cd /opt/java/ wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u302-linux-x64.tar.gz # 解压安装 tar -zxvf bisheng-jdk-8u302-linux-x64.tar.gz # 配置环境变量JAVA_HOME,指向JDK解压路径 export JAVA_HOME=/opt/java/bisheng-jdk1.8.0_302 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 验证JDK安装,执行如下命令显示对应JDK版本信息即安装完成 java -version ``` - BES安装 ```shell # 创建BES安装目录 mkdir BES9.5 tar -zxvf BES-AppServer-Standard-9.5xxxx.tar.gz -C BES9.5 ``` 为了集成BGMProvider支持GMTLS,需要将BGMProvider库和国密证书放入安装目录,如下 1. 将bgmprovider-xxxx-jar-with-dependencies.jar拷贝至BES9.5/lib目录下 2. 将server-sm2.p12证书文件放入BES9.5/conf/security目录 完成之后可以启动BES应用服务器: ``` shell cd BES9.5/bin ./iastool --passwordfile ../conf/.passwordfile --user admin start --server ``` 启动完成之后,可通过浏览器访问BES管理控制台,地址http://localhost:1900/console/,使用默认账号登录。 #### 配置GMTLS 为了能通过浏览器直接访问国密SSL协议的应用,此处我们单独创建http监听器,首先点击左侧**HTTP监听器**菜单,可以看到默认的四个监听器: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468247804663372.png) 新创建监听器http-listener-3,指定端口为8445,开启安全性和国密通道: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468267727877349.png) 在国密通道页面中指定以下参数: - GMTLS协议 - 证书昵称:server-sm2-sig,server-sm2-enc 需要填写签名证书昵称和加密证书昵称,签名证书昵称在前,加密证书昵称在后,以英文逗号分隔 - 签名证书和加密证书密钥库路径: ${com.bes.instanceRoot}/conf/security/server-sm2.p12,${com.bes.instanceRoot}/conf/security/server-sm2.p12 需要填写签名证书和加密证书密钥库路径,同样签名证书在前,加密证书在后,指定前文我们创建的国密证书server-sm2.p12,以英文逗号分隔,此处我们使用的同一个证书库,实际也可以使用不同的证书库。 - 密钥密码: changeit,changeit 需要填写加密证书密钥密码和签名证书密钥密码,以英文逗号分隔,此处填写我们在前文创建证书中指定的密钥密码 - 密钥库密码: changeit,changeit 需要填写加密证书密钥库密码和签名证书密钥库密码,以英文逗号分隔,此处填写我们在前文创建证书中指定的密钥库密码 - 密钥库类型: PKCS12,PKCS12 需要填写加密证书密钥库类型和签名证书密钥库类型,以英文逗号分隔,此处填写我们在前文创建证书中指定的密钥库类型 - 密码套件:ECC_SM4_CBC_SM3 填写GMTLS中使用的密码套件,多个以英文逗号分隔,支持四种密码套件:ECC_SM4_CBC_SM3,ECDHE_SM4_CBC_SM3,ECC_SM4_GCM_SM3,ECDHE_SM4_GCM_SM3 - 提供者:BGMProvider 填写GMTLS提供者,由于我们采用BGMProvider,因此此处填写BGMProvider即可 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468289017701949.png) #### 编写和部署测试应用GMDemo 这里我们编写一个简单的web测试应用部署到BES当中,一个静态页面index.html,内容如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <div style="text-align:left"> <h1>Hello bgmprovider GMTLS</h1> </div> </body> </html> ``` 通过***应用管理***来部署应用,部署完成之后,应用列表如下: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468306392805796.png) 部署应用之后,即可重启BES使得配置生效,重启方式如下: ```shell ./iastool --passwordfile ../conf/.passwordfile --user admin stop --server ./iastool --passwordfile ../conf/.passwordfile --user admin start --server ``` ### 测试GMTLS 在前文中已经在BES上部署了测试应用,并开启了GMTLS访问端口,现在我们选择国密浏览器来访问测试应用,这里我们选择密信浏览器,官网下载路径: https://app.mesince.com/browser/MeSignBrowser_setup.exe, 安装好之后,直接访问 https://localhost:8445/GMDemo/ ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468322452624135.png) 可以看到使用的证书确实我们在前文中创建的SM2国密证书。 ### 通过wireshark查看GMTLS握手过程 wireshark国密版本下载位置:https://github.com/pengtianabc/wireshark-gm/releases/download/wireshark-3.4.5-gm/Wireshark-win64-3.4.5.exe 通过过滤8445端口信息之后,重复上述访问步骤,可获取到如下报文: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468342498386984.png) 基本符合规范中的握手过程: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468390831301321.png) 从握手协议上看,和标准TLS并无太大差别,我们继续看几个核心握手消息的内容, Client Hello:客户端告诉服务端使用GMTLS协议、密码套件支持ECC_SM4_SM3(同ECC_SM4_CBC_SM3): ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468410665629238.png) Server Hello:确定密码套件选择ECC_SM4_SM3 Certificates:将服务端国密证书发给客户端(签名证书、加密证书、根证书) Server Key Exchange: 服务端密钥交换,细节可参考国密标准(*GM/T0024-2014* [4](#refer-anchor)和*GB/T38636-2020* [5](#refer-anchor)) ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468428814588910.png) Client Key Exchange: 客户端密钥交换 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468496580760297.png) 后续就是数据加密传输,此处不再叙述,详细可参考国密标准。从整个握手过程可判断确实已经在BES上实现GMTLS通信。 ## BES中使用BGMProvider同时开启GMTLS和TLS ### BES上配置同时支持GMTLS和TLS1.2 BGMProvider可同时支持GMTLS和标准TLS,那么下面只需要稍微修改BES中http监听器的配置就能实现GMTLS和标准TLS的自适应,首先回到国密通道配置页面配置以下参数: 在国密通道页面中指定以下参数: - GMTLS协议、TLS1.2协议 增加标准TLS1.2协议支持 [8](#refer-anchor) - 证书昵称:server-sm2-sig,server-sm2-enc,bes 增加BES自带的rsa证书昵称 - 签名证书和加密证书密钥库路径: ${com.bes.instanceRoot}/conf/security/server-sm2.p12,${com.bes.instanceRoot}/conf/security/server-sm2.p12,${com.bes.instanceRoot}/conf/security/keystore.jks 增加BES自带的rsa密钥库路径 - 密钥密码: changeit,changeit,changeit 增加BES自带的rsa密钥密码 - 密钥库密码: changeit,changeit,changeit 增加BES自带的rsa密钥库密码 - 密钥库类型: PKCS12,PKCS12,JKS 增加BES自带的rsa密钥库类型 - 密码套件:ECC_SM4_CBC_SM3,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 增加TLS1.2密码套件 - 提供者:BGMProvider 保持不变 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468519009442786.png) ### 多客户端访问测试应用 - 使用密信浏览器访问,结果和之前访问结果是一致的 - 使用普通非国密浏览器访问结果,使用的是标准TLS1.2协议和我们配置的TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256密码套件 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468540953160708.png) 从测试结果来看,已经支持标准SSL和GMSSL自适应。 ## 总结 经过上面的测试,毕昇JDK的BGMProvider国密库在不做修改的情况下完全可以集成到BES应用服务器当中,作为GMTLS的引擎,且基本功能测试正常,后续还可以测试其他密码套件以及性能测试等,除了web应用,在普通java应用中也可以尝试使用BGMProvider作为国密库使用。以上如有错误的地方,欢迎指正。## 参考 [1]https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html [2]https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#Introduction [3] http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=45B1A67F20F3BF339211C391E9278F5E [4] http://www.gmbz.org.cn/main/viewfile/20180110021416665180.html [5] http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=778097598DA2761E94A5FF3F77BD66DA [6] http://www.cfca.com.cn [7]https://gitee.com/openeuler/BGMProvider/wikis/%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3/BGMProvider%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97 [8] https://datatracker.ietf.org/doc/html/rfc5246 ## 后记 如果遇到相关技术问题(包括不限于毕昇 JDK),可以通过 Compiler SIG 求助。Compiler SIG 每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM 和 JDK 等相关编译技术,感兴趣的同学可以添加如下微信小助手入群。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468618649973162.jpg) ----- 原文转载自毕昇编译-[宝兰德BES在BGMProvider国密库上的实践](https://mp.weixin.qq.com/s/qncJz6chOz6A8WtUL5KnFg) 关注毕昇编译获取编译技术更多信息 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/25/1653468765188280781.jpg)
  • [问题求助] ESC无法安装jdk,找不到java-version,怎么弄呢?急急急
    安装jdk也安装不了,到底要怎么弄呢?
  • [毕昇JDK] 【最新动态】毕昇JDK团队主导的RISC-V port正式合入OpenJDK主线
    2022 年 3 月 14 日,华为毕昇 JDK 团队主导开发的 OpenJDK RISC-V port \[[1]] 正式合入 OpenJDK 主线 \[[2]],成为 OpenJDK 的官方 port 之一。OpenJDK 19 将会是第一个支持 RISC-V 后端的版本。 ## OpenJDK RISC-V port 介绍 RISC-V \[[3]] 是一个开源免费的 RISC 指令集架构。随着指令集架构设计逐渐成熟,越来越多的开发者参与到了 RISC-V 生态建设中,将 Java 带到 RISC-V 世界的呼声也越来越高。毕昇 JDK 团队 RISC-V port 工作时间线如下: - 2019 年,开始基于 OpenJDK 11 的 Linux/RISC-V 的移植工作 - 2020 年,在 OpenEuler 社区上开源: openEuler/bishengjdk-11 \[[4]] - 2021 年,与社区合作,基于 OpenJDK RISC-V port \[[5]],开展 upstream 流程 - 2022 年,合入 OpenJDK 主线 (JDK19) ### RISC-V port 特性介绍 RISC-V port 涉及的模块如下图所示: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/17/1652756667651242730.png) OpenJDK RISC-V port 提供如下特性: - Template Interpreter 模板解释器 - C1 (client) JIT 编译器 - C2 (server) JIT 编译器 - 当前主线支持的所有 GC (包括 ZGC 和 ShenandoahGC) RISC-V port 基于 RV64G (IMAFD) 基础指令集提供了 64 位 RISC-V 架构支持,此外还为 Vector、Compressed (由阿里开发者贡献)、Bit-Manipulation 扩展提供了实验性支持。实验性扩展需要通过 `-XX:+UseRVV`、`-XX:+UseRVC`、`-XX:+UseZba` 和 `-XX:+UseZbb` 选项来显式启用。 除此之外,基于正式发布的 ISA 扩展集合,RISC-V port 提供了 String、Array 和 BigInteger 等 Java 类的 intrinsic 支持。目前 RISC-V Cryptography Extension 尚未正式发布,因此涉及到其中加解密指令的 sha/crc 相关 intrinsic 还在计划中。 当前 RISC-V port 还提供了 32 位的 Zero 支持,RV32G 后端 port 由中科院软件所 PLCT 实验室团队主导开发,仓库地址:openjdk-riscv/jdk11u \[[6]]。 更多 RISC-V port 的内容,可以回顾毕昇 JDK 团队在 RISC-V 中国峰会上的报告:Porting OpenJDK to RISC-V \[[7]]。也可以在 riscv-port-dev \[[8]] 上发起讨论。 ### RISC-V port 测试情况 RISC-V port 测试主要在 QEMU 和 Native 环境中展开 (感谢中科院软件所 PLCT 实验室提供的 RISC-V 硬件和测试支持)。测试内容主要有功能测试 (jtreg tier {1,2,3,4},jcstress) 和相关 Java benchmark (SPECjvm2008、dacapo 等) 测试。 RISC-V port 实现了 C1/C2 JIT 编译器,相比 Zero 版本有较大的性能提升。下图对比了 RISC-V Server 和 RISC-V Zero 在 SPECjvm2008 上的性能差异,结果显示 RISC-V Server 性能可以达到 Zero 的 39 倍 \[[9]]。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/17/1652756708511198447.png) RISC-V port 在 SPECjbb2015 上的性能数据如下图所示: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/17/1652756729296880028.png) ## 体验 RISC-V JDK 目前 RISC-V JDK (JDK19) 可以直接通过 builds.shipilev.net \[[10]] 下载体验。如果没有硬件环境,可以通过交叉编译来构建 JDK。为了方便工具链的配置,文章中的构建步骤均基于 Docker,因此需要预先安装 Docker 环境。下面介绍如何从源码交叉编译 RISC-V JDK。 ### 构建环境配置 - x86_64 环境 (其他架构环境未经测试) - docker - adoptopenjdk/centos6_build_image \[[11]] 拉取最新的构建镜像: ``` $ docker pull adoptopenjdk/centos6_build_image:latest ``` 启动镜像: ``` $ docker run -it --rm adoptopenjdk/centos6_build_image ``` ### 源码构建 RISC-V JDK **拉取代码:** ``` $ git clone https://github.com/openjdk/jdk.git ``` **交叉编译:** ``` # add riscv toolchain to PATH and LD_LIBRARY_PATH $ export RISCV64=/opt/riscv_toolchain_linux $ export LD_LIBRARY_PATH=$RISCV64/lib64:/usr/local/gcc/lib64:/usr/local/gcc/lib $ export PATH="$RISCV64/bin:$PATH" $ export CC=$RISCV64/bin/riscv64-unknown-linux-gnu-gcc $ export CXX=$RISCV64/bin/riscv64-unknown-linux-gnu-g++ # configure and build $ bash configure \ --openjdk-target=riscv64-unknown-linux-gnu \ --with-sysroot=/opt/fedora28_riscv_root \ --with-boot-jdk=/usr/lib/jvm/jdk-18 \ BUILD_CC=/usr/local/gcc/bin/gcc-7.5 \ BUILD_CXX=/usr/local/gcc/bin/g++-7.5 $ make images ``` > 目前镜像中可能还未包含 jdk18,可以前往 Adoptium \[[12]] 下载 jdk18 作为 bootjdk。 ### 源码编译 QEMU RISC-V 如果没有硬件环境,可以通过 QEMU 模拟的方式来运行 JDK,下面简单介绍一下从源码编译 QEMU RISC-V: 获取 QEMU 源码: ``` $ git clone https://github.com/qemu/qemu.git ``` 构建 QEMU RISC-V: ``` $ cd qemu && mkdir build && cd build $ ../configure --prefix=/path/to/install/qemu \ --target-list=riscv64-linux-user,riscv64-softmmu $ make -j && make install ``` 源码编译过程中需要一些额外的依赖如 ninja 等,按需安装即可。编译完成后,可以在 /path/to/install/qemu 中找到对应的二进制。 ### 测试 java -version QEMU user 模式下: ``` $ qemu-riscv64 -L /path/to/sysroot /path/to/openjdk-riscv/bin/java -version ``` QEMU system 下,直接执行如下命令即可: ``` $ /path/to/openjdk-riscv/bin/java -version ``` ## 结语 经过 OpenJDK 开源社区和毕昇 JDK 团队的共同努力,OpenJDK RISC-V 终于成为 OpenJDK 的家族成员之一。这是第一个由华为团队主导的 OpenJDK 社区项目,也体现了毕昇 JDK 团队持续拥抱开源,回馈开源的信念。欢迎大家参与到 RISC-V OpenJDK 的开发中来,为 RISC-V 生态建设添砖加瓦。 ## 参考链接 1. https://wiki.openjdk.java.net/display/RISCVPort 2. https://github.com/openjdk/jdk/pull/6294 3. https://riscv.org/about 4. https://gitee.com/openeuler/bishengjdk-11/tree/risc-v 5. https://github.com/openjdk/riscv-port 6. https://github.com/openjdk-riscv/jdk11u 7. https://www.bilibili.com/video/BV1n64y1t7gc 8. https://mail.openjdk.java.net/mailman/listinfo/riscv-port-dev 9. https://twitter.com/shipilev/status/1479179438625595399 10. https://builds.shipilev.net 11. https://hub.docker.com/r/adoptopenjdk/centos6_build_image 12. https://adoptium.net/index.html [1]: https://wiki.openjdk.java.net/display/RISCVPort [2]: https://github.com/openjdk/jdk/pull/6294 [3]: https://riscv.org/about [4]: https://gitee.com/openeuler/bishengjdk-11/tree/risc-v [5]: https://github.com/openjdk/riscv-port [6]: https://github.com/openjdk-riscv/jdk11u [7]: https://www.bilibili.com/video/BV1n64y1t7gc [8]: https://mail.openjdk.java.net/mailman/listinfo/riscv-port-dev [9]: https://twitter.com/shipilev/status/1479179438625595399 [10]: https://builds.shipilev.net [11]: https://hub.docker.com/r/adoptopenjdk/centos6_build_image [12]: https://adoptium.net/index.html ## 后记 如果遇到相关技术问题(包括不限于毕昇 JDK),可以进入毕昇 JDK 社区查找相关资源(点击阅读原文进入官网),包括二进制下载、代码仓库、使用教学、安装、学习资料等。毕昇 JDK 社区每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM、JDK 和 V8 等相关编译技术,感兴趣的同学可以添加如下微信小助手,回复 Compiler 入群。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/17/1652756855113500117.jpg) ------- 原文转载自毕昇编译-[毕昇JDK团队主导的RISC-V port正式合入OpenJDK主线](https://mp.weixin.qq.com/s?__biz=MzkyNTMwMjI2Mw==&mid=2247484851&idx=1&sn=cba89992f41fbd3f7595bf17c787a7e4&chksm=c1c9e92bf6be603d63bb2d910ff1b69c86775f30521deae545f67fa93abdd093111e230db6af&token=762689440〈=zh_CN#rd) 关注毕昇编译获取编译技术更多信息 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/17/1652756940949216066.jpg)
  • [容器专区] 【Hi-Grid T1】【JDK】容器移植jdk 问题
    【操作步骤&问题现象】在容器移植 jdk-8u333-linux-arm32-vfp-hflt.tar.gz时出现了同https://bbs.huaweicloud.com/forum/thread-50103-1-1.html 帖子同样的问题,但是这个帖子并没有完结,使用readelf 命令查询到java 需要“/lib/ld-linux-armhf.so.3“但是容器默认没有这个文件,只有/lib/ld-linux.so.3和/lib/arm-linux-gnueabi/ld-linux.so.3 链接到/lib/arm-linux-gnueabi/ld-2.19.so, 创建链接文件/lib/ld-linux-armhf.so.3 到/lib/arm-linux-gnueabi/ld-2.19.so,  再执行java 命令提示以下信息:编辑/etc/ld.so.conf.d/java.conf 文件,把libjli.so 的路径添加到文件中,执行ldconfig ,但是执行java 命令还是提示上面的错误。但是执行ldconfig -p 检查libjli.so 已经加载
  • [交流吐槽] jdk 镜像站长期没有更新,首页搜索不到
    镜像站地址:Index of java-local/jdk (huaweicloud.com)搜索不到
总条数:97 到第
上滑加载中