天天写Java代码,它是怎么由源码编译出来的吗的

问道私服_问道私服下载了怎么修改源码_问道有私服吗

好奇害死羊

很多男伴每天做Java开发,写Java代码,肯定离不开Java基础环境:JDK,虽然我们写的Java代码也是运行在JVM虚拟机上的。

一般来说问道私服下载了怎么修改源码,在我们学习Java之前,第一步就是安装JDK环境。这个很简单,我们一般都是直接从官网下载JDK,安装好,配个环境变量就可以愉快的使用了。

不过话说回来,对于我们每天都在使用的这个东西,难道我们不好奇它是如何从源代码编译而来的吗?

带着这个最初的疑惑,我打算明天做大事,动动我可爱的小手,自己编译一个JDK!

对了,这篇文章已经被开源项目://收录了,包括自学编程路线,面试题集/,以及一系列技术文章等等,资源不断更新中……还有一个坑要填

记得之前没有关于《JDK源码阅读环境搭建》的视频和文章。细心的男同伴可能会发现一个很实际的问题:

我们将src.zip包中的JDK源码解压并关联到这个源码,调试的时候可以进入,添加注释的时候只能在行尾添加,不能改行原始代码的结构。. 也就是说,如果在源码中加入了多行注释,那么只有在调试的时候才会出现当前行的运行错位问题,这就有点尴尬了。

事实上,在那段视频的评论区,确实有几个男人问过这个问题:

问道私服_问道私服下载了怎么修改源码_问道有私服吗

问道私服下载了怎么修改源码_问道私服_问道有私服吗

问道私服下载了怎么修改源码_问道私服_问道有私服吗

原因也很简单,因为真正支持调试运行的代码并不是我们解压的JDK源码。

要解决这个问题,只能使用自己改过的代码编译生成自己的JDK,然后在项目中使用!

所以你说什么,你的肝就完了!

环境规划首先要说的是编译前的软件版本关系很重要。在我踩坑的时候,几乎所有出现的奇怪问题都与此有关。版本匹配后,非常流畅。

下面我们来盘点一下,梳理一下编译一个JDK需要哪些环境和工具:

1、

如果我们要编译JDK,首先要在自己的机器上预先安装一个JDK,官方称为JDK(或)。

例如,如果要编译JDK8,机器必须至少有一个JDK7或更新版本;如果要编译JDK11,那么机器必须安装JDK10或11。

所以鸡和蛋又来了……2、Unix环境

编译JDK需要Unix环境的支持!

这在Linux操作系统和macOS操作系统上自然是可以保证的,但是对兄弟来说就麻烦了一点,需要使用MinGW/MSYS等软件进行模拟。

正如官方所说:在Linux平台上编译JDK通常问题最少,容易成功;macOS 位居第二;它需要更多的努力,可能会有更多的问题。

根本原因在于它实际上并不是一个类 Unix 内核系统。虽然很多软件的原始编译都离不开Unix,但肯定是比较麻烦的。

3、编译器/构建工具链

大部分JDK底层源码(尤其是JVM虚拟机部分)都是用C++/C编写的,所以相关的编译器无法运行。

一张图片胜过千言万语。各平台的编译器支持如下表所示,可根据平台选择:

问道私服_问道有私服吗_问道私服下载了怎么修改源码

4、其他工具

典型例子:

好的,环境清单就到此为止。我来看看我在编译JDK8和JDK11时使用的软件的详细版本信息:

编译JDK8时:

编译JDK11时:

如果你在编译的过程中出现很多问题,很有可能是软件没有安装,或者软件版本不匹配。

下载JDK源代码

不过,有两种方法可以下载 JDK 源代码。

方法一:通过工具下载

可以理解为和Git一样,是另外一个代码管理工具。安装后,有一个 hg 命令可用。

问道私服下载了怎么修改源码_问道有私服吗_问道私服

源代码已经提前托管。

为此,例如要下载JDK8,可以直接,就像一样:

hg clone http://hg.openjdk.java.net/jdk8/jdk8

同样,下载JDK11:

hg clone http://hg.openjdk.java.net/jdk/jdk11

但是,这些格式的下载速度并不是很快。

方法二:直接下载打包好的源码包

下载链接:

问道有私服吗_问道私服_问道私服下载了怎么修改源码

选择您要下载的版本。

编译前手动配置

下载源码包后,放到本地目录下(建议路径为纯韩文,以免麻烦),解压,然后单步进入源码根目录执行:

sh configure

其实默认的配置项都是运行在这里的。

在这一步中,会进行一系列的手动配置工作,而且时间通常很快。如果最后有提示就很幸运了问道私服下载了怎么修改源码,编译前的配置工作就完成了!

这里我给自己分别配置JDK11和JDK8时的样子:

配置JDK8完成:

问道有私服吗_问道私服下载了怎么修改源码_问道私服

配置JDK11就完成了:

问道有私服吗_问道私服_问道私服下载了怎么修改源码

注意:如果这一步出现错误,大概率是某个软件环境没有安装,或者虽然安装了但版本不匹配,一般会在控制台拷贝日志中提醒。

比如我在配置JDK8的时候遇到错误:GCCis:

问道有私服吗_问道私服_问道私服下载了怎么修改源码

明明系统中有编译器,但是还是报这个错。后面通过修改jdk源码根目录///-.sh文件,注释相关两行代码后配置通过。

问道有私服吗_问道私服下载了怎么修改源码_问道私服

问道有私服吗_问道私服下载了怎么修改源码_问道私服

配置完成,拿出来,开始真正的编译动作吧!

真正的编译动作

我们这里做的是全编译,直接在我们下载的JDK源码根目录下执行如下命令即可:

make all

这一步编译需要一段时间,耐心等待即可。如果编译过程中出现错误,编译将被中止。如果你能看到下面两个画面,那么恭喜你,你已经通过了自己编译JDK源代码,可以喝杯奶茶庆祝一下了。

JDK8编译完成:

问道私服下载了怎么修改源码_问道私服_问道有私服吗

JDK11编译完成:

问道私服下载了怎么修改源码_问道私服_问道有私服吗

从两张图的对比可以看出,编译JDK8和JDK11的时候输出还是有区别的。时间上的差异很大程度上是因为从JDK11开始的编译器配置要高得多。

验证结果

JDK源码编译完成后,肯定会形成并输出很多产品,这是我们迫不及待想要听到的。

因为JDK8和JDK11的源码包的组织结构不同,输出的内容和位置也不同。让我们一一来看看。

1、为 JDK8 编译输出

编译完成后会在build目录下生成一个—-目录,所有的编译结果都在里面。

首先,编译后的 Java 可执行文件可以在以下目录中找到:

JDK源码根目录/build/—-/jdk/bin

进入该目录后,可以输入 ./java- 进行验证:

问道私服下载了怎么修改源码_问道有私服吗_问道私服

二、编译生成的成品JDK包,可以在目录下找到

jdk源码根目录/build/macosx-x86_64-normal-server-release/images

发现如下,如图:

问道有私服吗_问道私服下载了怎么修改源码_问道私服

在:

进入j2sdk-image目录,你会发现上面的内容和我们平时从网上下载的成品JDK的内容是一致的。

问道私服_问道有私服吗_问道私服下载了怎么修改源码

2、JDK11的编译输出JDK11的源码目录组织与JDK8本身不同。编译出来的产品和之前编译JDK8的输出有些出入,但也不大。

JDK11编译完成后,build目录下也会生成一个—-目录,所有的编译结果都在里面。

同一个编译好的Java可执行程序可以在目录中找到

JDK源码根目录/build/—-/jdk/bin

如下图所示,进入目录后,还可以输入./java-命令进行验证:

问道有私服吗_问道私服下载了怎么修改源码_问道私服

问道私服_问道有私服吗_问道私服下载了怎么修改源码

二、编译生成成品JDK11包,可以在目录下找到

JDK源码根目录/build/macosx-x86_64-normal-server-release/images

发现如下,如图:

问道有私服吗_问道私服_问道私服下载了怎么修改源码

jdk目录是编译生成的JDK11成品包。

使用自己编译的 JDK

现在我们已经编译完成了 JDK,我们必须使用它。

新建一个最基本的Java项目,例如命名,目的是使用自己编译的JDK。

问道私服下载了怎么修改源码_问道有私服吗_问道私服

我们点击它,选择SDKs选项,添加我们刚刚编译生成的JDK,选择它作为项目的JDK,看看是否可以正常工作

问道有私服吗_问道私服_问道私服下载了怎么修改源码

问道有私服吗_问道私服_问道私服下载了怎么修改源码

单击确定后,我们运行它:

问道有私服吗_问道私服_问道私服下载了怎么修改源码

可以看到我们自己编译的JDK已经被使用过了。

关联JDK源代码和更改

我们继续将JDK源码与上一个项目的→SDKs中下载的JDK源码路径关联起来:

问道私服_问道有私服吗_问道私服下载了怎么修改源码

这样方便我们在我们下载的JDK源码的源码中阅读、调试、修改以及做注释和注释。

举个最简单的例子,比如我们打开 .out.() 函数的底层源码:

问道私服_问道有私服吗_问道私服下载了怎么修改源码

我们随意改一下,加两行简单的标记,像这样:

问道有私服吗_问道私服_问道私服下载了怎么修改源码

为了让我们新添加的这行代码生效,我们必须到JDK源码的根目录下再次执行make重新编译生成JDK才能生效:

问道有私服吗_问道私服_问道私服下载了怎么修改源码

由于之前已经完全编译过,所以再次make的时候增量编译通常很快。

重新编译后,我们再次运行项目,可以看到修改后的效果:

问道私服下载了怎么修改源码_问道有私服吗_问道私服

多行注释的问题

记得之前搭建“JDK源码阅读环境”的时候,你可能发现了一个问题:阅读源码,对源码做一些注释或者注释是很常见的!但是当时有一个问题,就是在做注释的时候不能改变代码的行结构(只能行尾注释,不能跨行注释),否则调试时会出现行号错位的问题。

原因很简单,因为我们好像已经映射了源码目录,而真正支持运行的JDK还是预装的JDK环境,并没有按照我们改过的源码重新编译建立,所以看这里, 解决这个问题很简单,像以前一样自己编译JDK即可。

其实在实验过程中,还有一个很典型的问题,就是添加多行英文注释时,重新编译的时候会报错!

比如以上例中最简单的.out.()源码为例,我们添加几行英文注释:

问道私服下载了怎么修改源码_问道私服_问道有私服吗

这时候我们去JDK源码目录编译,会发现满屏类似这个错误:

错误:不可映射的字符编码 ascii

问道有私服吗_问道私服下载了怎么修改源码_问道私服

突然有点迷茫,虽然只加了几行评论。对我们来说,在源码中写多行英文注释基本是刚需,但是编译会报错,可以让人开心……当时我的背有点凉。

说实话,这个问题我调查了一段时间,熬夜很晚。最后经过一番折腾,通过以下方法解决了。顺便说一句,我将与男人分享。如果遇到这个问题,可以参考一下。

既然从控制台报错可以很明显的看出,肯定是字符编码相关的问题导致的,都指向ascii的这些编码形式。

于是我把JDK的源码从根目录导出到,然后在整个目录中搜索ascii相关的内容,看看有没有疲劳,发现

jdk源码根目录/make//.gmk文件中有两个地方指定了ascii相关的编码方式:

问道有私服吗_问道私服下载了怎么修改源码_问道私服

因此,尝试将 -ascii 都替换为 -utf-8:

问道有私服吗_问道私服下载了怎么修改源码_问道私服

然后再次执行make编译,编译成功!

问道私服_问道私服下载了怎么修改源码_问道有私服吗

你完成了!

这样,阅读、调试或定制JDK源代码都非常方便。

杂记:本文已被开源项目://收录,包括自学编程路线,面试题集/,以及一系列技术文章等。资源不断更新中……

每晚进步一点点

越慢越快

未经允许不得转载:wendaosf.com » 天天写Java代码,它是怎么由源码编译出来的吗的
评论 (0)