wsl下ubuntu20.04配合clion编译openjdk8并运行

2023-11-14

起因

最近,看synchronized的锁的底层原理,其中有一个涉及底层C++部分的objectMonitor对象,在进一步了解的过程中,以及之前看深入理解java虚拟机中第一部分,自己编译jdk的触发,开始考虑本地编译jdk,在jdk上进行调试的想法,遂开始网上找文档,我的环境是wsl(ubuntu)+clion.

心路历程

我一开始一直以为这个难点在于wsl的ubuntu毕竟不是原生的,依附于windows,这方面比较新,可能参考资料不多,查找教程也是往wsl编译jdk上靠,遂找到这两个方案,(219条消息) 《深入理解Java虚拟机:JVM高级特性与最佳实践(第三版)》中使用WSL进行JDK编译并在CLion中调试_cy948的博客-CSDN博客
(219条消息) Windows 10 + WSL(ubuntu 20.04) + CLion 编译JDK12_砖头23333的博客-CSDN博客,其实按部就班的按上面来,也未必有问题,不过哎,我就想编译jdk8版本的,没成想,这点坚持开始了后期的精神折磨.

遇到的问题:

jdk8的源码超级不好下,搜索下载jdk8源码,往往两个方案:

第一,官方下载源代码

这个一般通过openjdk官方,里面选择自己想要的版本,点进去是这样的:在这里插入图片描述

这里有个巨坑,从官方下载的,有的是全部源码,相关jar都会下载下来,有的是类似maven版本控制那种,只有个类似pom.xml文件.

第二,直接下载成品:

一方面github上面也有github/openjdk,其实这个也是官方,不过版本标注模式比较迷,其实gitee也有一样的镜像gitee,这个也是,版本标注迷,还有最新更新只到2017年左右,我们知道实际上jdk8一直在维护的.这个版本不是最新的.

可惜我都试过了,这两种都不是太行,注意,是不太行,不是不行.考虑到我的能力,但就已知问题看,小问题太多太多,虽然大部分都有解决方案,但你在修改过程中,明显感受到版本问题很重,有些是修改源码,有些是删除源码.

最终我卡在了提示cc1plus: all warnings being treated as errors,这个意思gcc把警告当作错误处理,解决方案有,但前提要gcc降版本,一方面./config -no-warnings-are-errors这种方式,高版本gcc不生效,添加环境变量我也试了也是没效果,目前了解到可能要降到gcc4开头的版本可能有效果,将版本也是个痛苦的事情,问题还不一定有效果,4.9的我试了不行,目前手里有4.8.2的gcc,还没试,到这一步,基本就搞一天了,主要下jdk是真的恶心,格局小了,一开始出于谨慎,这种非官方来源的代码不是特别敢运行,沙箱啥的又觉得费劲,所以用第一种方案下的源代码,哎,巧了!刚好下的就是那种需要运行类似git的拉去源代码的形式,通过命令hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/拉取源代码,我以为下下来的就是全部的源码,运行make images命令,死活编译过不去,其实下载的官方文档doc/building.md里面有步骤说明…,害,主要现在遇到问题,还停留在走一步看一步,不行上百度的层次,还没到高手那种系统的方法论,找官方,看源码.好在,以前自己搞事情的经验告诉我,还是要灵活,换个法,我就开始搜编译jdk8,侧重点不放在wsl上了,事实证明这是对的,!!!实战:自己编译JDK | 码农家园 (codenong.com),原本完全按照这个博主的做法做就行了.主要用hg命令下载是真的慢,我想着用github上下载好的,走博主这个模式不就行了…谁知又是坑,版本问题,版本问题,版本问题,重要的事情说三遍,还是会出现上文的问题.

这时我留个后手,昨天用hg下了一天的源码貌似下好了,hg命令下载的时候一定要选择适合自己的版本,这里我20.04的ubuntu,应用进项apt-get update之后,我从官网选择jdk8里面的jdk8u,也可以考虑jdk8u-dev,这两个我看基本上最后更新日期都很新.然后我按照博主的方法完美运行.clion部分参照最上面两个wsl文章即可。

总结:

基于版本考虑,能从官方下就从官方下目标jdk版本下最新版本的源代码(如果自己的操作系统本身比较新的话),下完看下readme文档,里面有要不要用hg命令再次拉取源代码.只要源码本身全且与系统契合,make编译时你会发现及其丝滑,我用官方jdk8最新源码加hg命令拉取源代码,最后make时,一次通过!!!

在这里插入图片描述上图有一处与二者的不同,由于我选择的jdk8u的版本很新,个人推测应该是用再像之前那样,选择jdk7 的版本了,可以直接考虑用自己编译出的java命令.

心得体会:

版本问题依然是工程开发过程中的不可避免的棘手问题,记得我自己上手的第一个大一点的demo项目,作死,改了一个mavenJar包的版本,牵一发动全身,bug不断,自己构建项目整体,整体对于版本控制这方面,还是应该上心些.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wsl下ubuntu20.04配合clion编译openjdk8并运行 的相关文章

  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • 常见数据库面试题整理

    本文主要转载自 http www cnblogs com remember forget p 6140112 html 一 什么是存储过程 有哪些优缺点 存储过程是一些预编译的SQL语句 更加直白的理解 存储过程可以说是一个记录集 它是由一
  • av_frame_free释放全部和av_frame_unref释放数据

    AVFrame结构 av frame alloc申请内存 av frame free释放内存 容易混淆的是av frame unref 它的作用是释放音视频数据资源 而av frame free是释放所有资源 包括音视频数据资源和结构体本身
  • VMware安装Android x86_64 8.1 虚拟机

    Vmware 安装 Android 虚拟机 原文摘录于 https www bbsmax com A kvJ3eg7Adg https blog csdn net Iamzhouyd article details 122796439 ht
  • 启动容器启动gpu报错

    sudo docker run itd name joint train p 9090 22 shm size 32G gpus all env DISPLAY v tmp X11 unix tmp X11 unix 10e7a6213e2
  • buck同步整流sw点负压问题

    buck同步整流sw点负压问题 1 前言 2 产生原因 3 影响 4 解决方法 5 buck同步整流逆流问题 5 1 产生原因 5 2 影响 5 3 解决方案 1 前言 有人突然问我一个专业问题 我以为我知道 结果并没有 尴尬 不过我也挺喜
  • Mybatis开发环境搭建

    Mybatis开发环境搭建 一 创建web工程并导入jar包 1 创建一个web工程 2 创建classes与lib文件夹 设置编译输出路径与测试路径 设置依赖的jar包目录 3 导入jar包 并设置add as library 二 编写M
  • mysql教程 新建连接_七、MySQL 创建连接

    连接到 MySQL 服务器由三种办法 使用 mysql 命名 使用 Navicat MySQL 客户端和使用各种开发语言连接 使用 mysql 命令连接 mysql 命令一般会随着 MySQL 安装而自带 这是最基本的也是最容易连接到 My
  • 好简单的RabbitMQ安装(Windows)

    目录 Windows下安装RabbitMQ需要以下几个步骤 1 安装erlang语言环境 下载erlang 设定环境变量 验证安装环境结果 2 下载并安装RabbitMQ 下载 安装主文件 安装RabbitMQ Plugins插件 登入管理
  • 代码审计方法与步骤

    代码审计方法与步骤 一 审计前的准备 1 获得源码 大多数PHP程序都是开源的 找到官网下载最新的源码包 2 安装网站 在本地搭建网站 一边审计一边调试 实时跟踪各种动态变化 二 把握大局 1 网站结构 浏览源码文件夹 了解该程序的大致目录
  • react滚动到指定位置_react 中 scrollTo 引发的思考

    如何在 React 中实现 scrollTo 效果 之前考虑过用scrollInToView 但是由于这个 API 实现的场景不能控制元素在屏幕上的显示位置遂选择其他出路 scrollTo 当只有一个元素需要直接滚动时 可以在 useEff
  • 一个插件,让你的 ChatGPT 不再报错!

    最近几天 相信大家都发现了 ChatGPT 一个问题 就是官网报错越来越频繁了 当你需用 ChatGPT 来处理一些比较琐碎的任务时 一旦你离开页面时间比较久 再度返回跟它进行对话 就会出现如下报错 虽然这个报错信息也曾有过 但没这么频繁
  • vscode 批量格式化

    今天推荐一个 vscode 批量格式化的扩展 Format Files 这个插件会依次打开需要格式化的文件进行格式化 使用方法很简单 在需要格式的文件夹右键 就可以看到开始格式化的操作 按照步骤进行即可 当然使用的前提 vscode 已经配
  • vue实现侧边栏导航和滚动定位

  • 计算机丢失msvcp90dll怎么办,msvcp90.dll

    msvcp90 dll官方版 msvcp90 dll官方版是电脑系统中不可缺少的dll文件 msvcp90 dll可以解决系统提示 找不到msvcp90 dll 或 msvcp90 dll 或者 msvcp90 dll 等情况 msvcp9
  • Win10家庭中文版开机后弹窗无法登录到你的账户点注销没用(解决过程记录)

    问题 之前一切正常 用完电脑后关机 没有提示有更新 也没更改系统设置 注册表什么的 时隔两天后开机就直接进入了临时账户 并弹窗 无法登录到你的账户 下面提示 通常可以通过从你的账户注销 然后重新登录来解决此问题 如果不立即注销 你创建的任何
  • Ubuntu系统配置花生壳内网穿透

    前言 本文档是基于被访问主机已经安装ssh服务 并且在内网已经确定ssh可用的情况下 做的穿透配置流程 一 被访问主机准备工作 被访问主机上下载花生壳并安装 我的是Ubuntu 1 Ubuntu安装包的下载命令如下 wget https d
  • 宏定义报重载错误

    我写了一个宏定义 define SWAP a b swap a a b b swap 然后在函数中进行引用 for i 1 i lt ma i SWAP covar k i covar j i 在编译过程中出现如下错误 error over
  • [Leetcode] 747. 至少是其他数字两倍的最大数

    题目描述 在一个给定的数组nums中 总是存在一个最大元素 查找数组中的最大元素是否至少是数组中每个其他数字的两倍 如果是 则返回最大元素的索引 否则返回 1 示例 1 输入 nums 3 6 1 0 输出 1 解释 6是最大的整数 对于数
  • FAST CGI的配置

    试着写一点fast cgi 查了一下 中文关于fast cgi的安装发现就一个文章 大家都是抄那个文章 那个文章写的还是不错 就是比较简单 只能指导大概的方法和方向 配置那个地方写的非常粗略 E文有一个文章写的非常详细 地址在这里 如果E文
  • wsl下ubuntu20.04配合clion编译openjdk8并运行

    起因 最近 看synchronized的锁的底层原理 其中有一个涉及底层C 部分的objectMonitor对象 在进一步了解的过程中 以及之前看深入理解java虚拟机中第一部分 自己编译jdk的触发 开始考虑本地编译jdk 在jdk上进行