☕【Java技术指南】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)
Win10下编译OpenJDK8
编译环境
- Windows10专业版64位;
编译前准备
Tip: 以下软件的安装和解压目录尽量不要包含中文或空格,不然可能会出现问题
- 安装 Visual Studio 2010 Professional
在windows下编译JDK需要使用Visual Studio 2010 Professional,推荐下载地址:https://msdn.itellyou.cn/
最好下载英文版的IDE,不然可能会出现问题,下载完成后只用勾选安装C++部分就行
- 准备OpenJDK8
首先下载OpenJDK8,推荐下载地址:https://download.java.net/openjdk/jdk8 , 下载完成后解压
- 编译JDK环境安装(如果已经安装,跳过此部)
编译OpenJDK需要本机先安装上JDK作为编译JDK,而且该编译JDK的版本必须要使用前一个版本的JDK,编译OpenJDK8需要安装JDK7 Update 7 以后的版本。
首先下载Oracle JDK7 并解压,推荐下载地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
下载完成后配置JDK环境变量(JAVA_HOME、Path、classpath)
- 安装Cygwin
编译JDK需要使用到Unix和Linux上的一些工具软件,Cygwin可以在Windows上运行这些系统上的软件。
推荐下载地址:http://www.cygwin.com/

下载最新版的Cygwin后安装,由于默认的安装只会安装一些必要的软件,所以安装过程中需要选择安装一些额外的包,需要的包如下图:
如果已经安装完了Cygwin软件后,想要继续安装其他的软件包,可以再次运行Cygwin的安装程序,在过程中确保其选中了本地的Cygwin安装目录,一直点击下一步后会出现选择安装包的界面。
- 准备FreeType-2.7
编译JDK需要用到FreeType,它是一个字体渲染库,官方文档中没有提及,但它是必须的。
最好使用2.7版本的,我先前使用较新版本的会出现问题。
推荐下载地址:https://www.freetype.org/ ,下载完成后解压: https://www.freetype.org/download.html
运行Visual Studio 2010,依次点击 File -> Open -> Project/Solution

选择打开 freetype-2.7\builds\windows\vc2010\freetype.sln 文件

选中项目后右击选择Properties,弹出窗口后操作如下图:


点击应用后再点击确定关闭窗口,右击项目,点击 Build 按钮后成功编译出lib文件。
再次右击项目,点击 Properties按钮,弹出窗口。

点击应用后再点击确定关闭窗口;右击项目,点击 Build 按钮后成功编译出dll文件。
在 freetype-2.7/ 目录下新建 lib 目录
将 freetype-2.7\objs\vc2010\x64\ 目录下的 freetype.lib 和 freetype.dll 两个文件拷贝到lib目录下
开始编译
- 生成编译配置脚本
运行Cygwin,cd 进入OpenJDK8的根目录
Tip :Cygwin中的目录可以直接用Windows的目录标记方式,比如:‘D:\DirName\file.txt’,单必须使用单引号包围,也可以使用类似linux的形式:如: /cygdrive/d/DirName/file.txt,推荐使用后一种方式兼容性较好。
输入如下命令:
./configure --with-freetype=你本机路径/freetype-2.7/ --with-target-bits=64 --enable-debug
注意以上的freetype路径替换成你本机上的路径,运行成功后显示如下:
- 编译JDK
Cygwin切换到Open JDK根目录下,执行如下命令
make all
命令执行后会开始编译,编译过程可能比较久,具体看机器性能,编译成功后显示如下:
- 验证编译结果
在这里仅简单验证一下,官方说需要用jtreg来进行回归测试,但该测试比较麻烦和耗时所以就先忽略运行 cmd.exe ,进入目录 openjdk8\build\windows-x86_64-normal-server-fastdebug\jdk\bin,依次输入命令:
javac -version
java -version

失败问题处理
- 提示cygwin太老,但使用的cygwin确实是1.7版本以后的版本,提示如下如图:

这是由于OpenJDK8自带的生成配置的脚本的问题。

文本编辑器打开OpenJDK目录下的 openjdk8\common\autoconf\generated-configure.sh 这个文件搜索上面的提示文字“Your cygwin is too old在这里插入图片描述,将if条件语句注释掉

- 编译images库时失败
执行编译到images相关库的时候会出错

在这里插入图片描述错误信息中显示了一个CreateJars.gmk出错,查阅相关资料后发现是文件中需要加上两个回车符号,也就是 '\r’表示为CR这个符号。
- 用 Notepad++ 软件打开OpenJDK目录里的 CreateJars.gmk 这个文件
- 依次点击菜单栏中的:视图 -> 显示符号 -> 显示所有符号
- 然后就可以看到所有的符号,包括换行符和回车符

找到文件中如下的地方:

在两个 ‘class$$’ 中间加入回车符号(按下Ctrl + M),如下图:

修改完成后保存,执行 make clean 命令清理后再次执行 make all 编译
参考文章
文本在编写和实施过程中参考了如下的博文或文章:
https://blog.csdn.net/wqlinloveruby/article/details/80409031
https://www.jianshu.com/p/e85f93cc74cb
OpenJDK源码目录下的README-builds.html官方文档
https://blog.csdn.net/qq0012520/article/details/86014579
☕【Java技术指南】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)的更多相关文章
- ☕【Java技术指南】「编译器专题」深入分析探究“静态编译器”(JAVA\IDEA\ECJ编译器)是否可以实现代码优化?
技术分析 大家都知道Eclipse已经实现了自己的编译器,命名为 Eclipse编译器for Java (ECJ). ECJ 是 Eclipse Compiler for Java 的缩写,是 Jav ...
- 🏆【Java技术专区】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!
前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...
- SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- Java已五年1—二本物理到前端实习生到Java程序员「回忆贴」
关键词:郑州 二本 物理专业 先前端实习生 后Java程序员 更多文章收录在码云仓库:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 没有 ...
- ☕【Java技术指南】「并发原理专题」AQS的技术体系之CLH、MCS锁的原理及实现
背景 SMP(Symmetric Multi-Processor) 对称多处理器结构,它是相对非对称多处理技术而言的.应用十分广泛的并行技术. 在这种架构中,一台计算机由多个CPU组成,并共享内存和其 ...
- ☕【Java技术指南】「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)!
问题概括 静态常量可以再编译器确定字面量,但常量并不一定在编译期就确定了, 也可以在运行时确定,所以Java针对某些情况制定了常量优化机制. 常量优化机制 给一个变量赋值,如果等于号的右边是常量的表达 ...
- ☕【Java技术指南】「TestNG专题」单元测试框架之TestNG使用教程指南(上)
TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 功能都差不多, 只是功能更加强大,使用也更方便. 详细使用说明请参考官方链接:https://testng ...
- ☕【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(基础篇)
前提概述 Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行. 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一 ...
- ☕【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)
前提概要 在开发过程中在使用多线程进行并行处理一些事情的时候,大部分场景在处理多线程并行执行任务的时候,可以通过List添加Future来获取执行结果,有时候我们是不需要获取任务的执行结果的,方便后面 ...
随机推荐
- 剑指offer 37-42
37. 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 思路: 1.平衡二叉树的定义为,当为空树或左右子树高度小于等于1,同时左右子树都要为平衡二叉树. 2.先分别求出左右子树的高度,比较高度差,如果 ...
- DawgCTF wp(re和crypto)
简单写写思路,想看详解的..我脚本有些丢失了..师傅请移步. 挂了个vpn,算正式打这种国际赛,全是英文.上去打了两天,昨晚晚上划水了一晚上补作业...,re那时候写出来三道,Potentially ...
- HCNA Routing&Switching之路由基础
在开始聊路由之前,我们首先要明白在网络通讯里,什么是路由?什么是路由表.路由器以及网关的相关术语:路由简单讲就是指网络数据包从源头到目标的路径,主要用来为不同网络间通讯提供数据包转发依据:路由表就是多 ...
- asp.net mvc中的安全性
1.重复提交攻击:通过Bind特性指定要绑定和不绑定的值. 2.Cookie盗窃:阻止脚本对站点中Cookie的访问,webconfig文件中添加<HttpCookies domain=&quo ...
- C语言:随机抽奖
#include <stdio.h> #include <stdlib.h> //<stdlib.h>用于调用 rand(), #include <time. ...
- MapReduce学习总结之简介
执行步骤:1)准备Map处理的输入数据 2)Mapper处理 3)Shuffle 4)Reduce处理 5)结果输出 三.mapreduce核心概念: 1)split:交由MapReduce作业来处理 ...
- ubuntu平台下,字符集的转换命令iconv
iconv命令格式 iconv -f 源字符集(要转换文件的字符集) -t 目标字符集 file iconv -f gb18030 -t utf-8 file 默认情况下,不改变原文件,输出到屏幕. ...
- Leetcode4. 寻找两个正序数组的中位数
> 简洁易懂讲清原理,讲不清你来打我~ 输入两个递增数组,输出中位数
PAT乙级:1083 是否存在相等的差 (20分) 题干 给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数字相减(大减小), ...
- 前端基础EL表达式(八)
一.什么是EL表达式? 1.什么是EL表达式? EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言, ...




