【Java原理探索】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)

简介: 【Java原理探索】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)

Win10下编译OpenJDK8


编译环境

  • Windows10专业版64位;


编译前准备


Tip: 以下软件的安装和解压目录尽量不要包含中文或空格,不然可能会出现问题

  1. 安装 Visual Studio 2010 Professional


在windows下编译JDK需要使用Visual Studio 2010 Professional,推荐下载地址:msdn.itellyou.cn


image.png


最好下载英文版的IDE,不然可能会出现问题,下载完成后只用勾选安装C++部分就行


  1. 准备OpenJDK8

首先下载OpenJDK8,推荐下载地址:download.java.net/openjdk/jdk… , 下载完成后解压

image.png




  1. 编译JDK环境安装(如果已经安装,跳过此部)
  • 编译OpenJDK需要本机先安装上JDK作为编译JDK,而且该编译JDK的版本必须要使用前一个版本的JDK,编译OpenJDK8需要安装JDK7 Update 7 以后的版本。
  • 首先下载Oracle JDK7 并解压,推荐下载地址:www.oracle.com/technetwork…


下载完成后配置JDK环境变量(JAVA_HOME、Path、classpath)


  1. 安装Cygwin
  • 编译JDK需要使用到Unix和Linux上的一些工具软件,Cygwin可以在Windows上运行这些系统上的软件。
  • 推荐下载地址:www.cygwin.com/


image.png


下载最新版的Cygwin后安装,由于默认的安装只会安装一些必要的软件,所以安装过程中需要选择安装一些额外的包,需要的包如下图:

image.png


如果已经安装完了Cygwin软件后,想要继续安装其他的软件包,可以再次运行Cygwin的安装程序,在过程中确保其选中了本地的Cygwin安装目录,一直点击下一步后会出现选择安装包的界面。


  1. 准备FreeType-2.7
  • 编译JDK需要用到FreeType,它是一个字体渲染库,官方文档中没有提及,但它是必须的。
  • 最好使用2.7版本的,我先前使用较新版本的会出现问题。
  • 推荐下载地址:www.freetype.org/ ,下载完成后解压: www.freetype.org/download.ht…
  • 运行Visual Studio 2010,依次点击 File -> Open -> Project/Solution


image.png

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

image.png

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

image.png

image.png


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


再次右击项目,点击 Properties按钮,弹出窗口。

image.png


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


在 freetype-2.7/ 目录下新建 lib 目录 将 freetype-2.7\objs\vc2010\x64\ 目录下的 freetype.lib 和 freetype.dll 两个文件拷贝到lib目录下



开始编译


  1. 生成编译配置脚本

运行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路径替换成你本机上的路径,运行成功后显示如下:


image.png

  1. 编译JDK

Cygwin切换到Open JDK根目录下,执行如下命令

make all
复制代码

命令执行后会开始编译,编译过程可能比较久,具体看机器性能,编译成功后显示如下:

image.png



  1. 验证编译结果

在这里仅简单验证一下,官方说需要用jtreg来进行回归测试,但该测试比较麻烦和耗时所以就先忽略运行 cmd.exe ,进入目录 openjdk8\build\windows-x86_64-normal-server-fastdebug\jdk\bin,依次输入命令:

javac -version
java -version


image.png



失败问题处理


  1. 提示cygwin太老,但使用的cygwin确实是1.7版本以后的版本,提示如下如图:


image.png


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

image.png


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

image.png



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

image.png


在这里插入图片描述错误信息中显示了一个CreateJars.gmk出错,查阅相关资料后发现是文件中需要加上两个回车符号,也就是 '\r’表示为CR这个符号。


  • 用 Notepad++ 软件打开OpenJDK目录里的 CreateJars.gmk 这个文件
  • 依次点击菜单栏中的:视图 -> 显示符号 -> 显示所有符号
  • 然后就可以看到所有的符号,包括换行符和回车符


image.png


找到文件中如下的地方:

image.png


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


image.png


修改完成后保存,执行 make clean 命令清理后再次执行 make all 编译




















相关文章
|
13天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
25天前
|
开发框架 Java API
java反射机制的原理与简单使用
java反射机制的原理与简单使用
17 1
|
21天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
60 0
|
23天前
|
Java
软件工程设计原理里氏替换原则 ,具体实现及JAVA代码举例
里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计的基本原则之一,由Barbara Liskov提出。这个原则指出,如果类 S 是类 T 的子类型,则程序中使用 T 的对象的地方都可以不经修改地使用 S 的对象。换句话说,子类的对象应该能够替换掉它们的父类对象,而不影响程序的正确性。这个原则强调了继承关系中的行为兼容性,保证了基类和派生类之间的正确抽象和继承关系。
23 3
|
2天前
|
Oracle Java 关系型数据库
Java 开发者必备:JDK 版本详解与选择策略(含安装与验证)
Oracle Java SE 支持路线图显示,JDK 8(LTS)支持至2030年,非LTS版本如9-11每6个月发布且支持有限。JDK 11(LTS)支持至2032年,而JDK 17及以上版本现在提供免费商用许可。LTS版本提供长达8年的支持,每2年发布一次。Oracle JDK与OpenJDK有多个社区和公司构建版本,如Adoptium、Amazon Corretto和Azul Zulu,它们在许可证、商业支持和更新方面有所不同。个人选择JDK时,可考虑稳定性、LTS、第三方兼容性和提供商支持。
6 0
|
7天前
|
Java 应用服务中间件 Maven
使用IDEA搭建SpringMVC环境,Maven导入了依赖,但是运行报错 java.lang.ClassNotFoundException
使用IDEA搭建SpringMVC环境,Maven导入了依赖,但是运行报错 java.lang.ClassNotFoundException
8 1
|
8天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
15 0
|
17天前
|
Java 开发者
软件工程设计原理接口隔离原则 ,具体实现及JAVA代码举例
【4月更文挑战第7天】接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计原则之一,旨在减少不必要的依赖关系,通过拆分庞大且臃肿的接口为更小、更具体的接口来实现。这个原则强调“客户端不应该被迫依赖于它不使用的接口”,意味着一个类不应该被迫实现它不使用的方法。
16 1
|
17天前
|
Java
软件工程设计原理依赖倒置原则 ,具体实现及JAVA代码举例
【4月更文挑战第5天】在软件工程中,依赖倒置原则(Dependency Inversion Principle, DIP)是一项重要的设计原则,它是SOLID原则中的一个组成部分。这个原则主张高层模块不应该依赖于低层模块,而是应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这种设计方法有助于降低代码间的耦合度,增强系统的灵活性和可维护性
20 0
|
17天前
|
Java 关系型数据库
软件工程设计原理开放封闭原则 ,具体实现及JAVA代码举例
【4月更文挑战第4天】开放封闭原则(Open/Closed Principle, OCP)是面向对象设计的核心原则之一,它指出软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着在不修改已有代码的前提下,可以通过扩展来增加新的功能,从而提高软件系统的灵活性和可维护性
17 1