Ubuntu16.04 编译 OpenJDK7
来源:互联网 发布:软件架构师 编辑:程序博客网 时间:2024/06/09 06:48
《深入理解Java虚拟机》第二版第一章实践
准备
- Mercurial
sudo apt-get install mercurial
- OpenJDK7
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-devcd jdk7u-devchmod 755 get_source.sh./get_source.sh
当前的jdk7u-dev
大小为756MB
要是对自己的网速没有信心,也可以选择在云服务器上先下载好,然后进行压缩,再传输至本地,实测压缩后仅有250MB
左右
编译过程
依赖
sudo apt-get install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant
其中,openjdk-6-jdk
是不能直接apt-get
的,google以后Github-bmaupin给出了一个解决方案,我们可以直接去到http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html
,选择合适的包下载。下载前还需要注册一个Oracle帐号。下载好jdk-6u45-linux-x64.bin
后复制到想要的目录并运行,相同目录下就会创建一个包含有jdk的文件夹。libmotif3
也不能直接安装,需要从https://launchpad.net/ubuntu/xenial/amd64/libmotif3/2.3.4-8ubuntu1
下载- 环境变量设置
environment.sh
见最后,输入source environment.sh
,然后make sanity
检查
如果输出是Sanity check passed
,则证明检查通过,可以进行make了
编译
- 输入
make 2>&1 | tee $ALT_OUTPUTDIR/build.log
进行编译 - 若出现以下信息,则证明编译成功
#-- Build times ----------Target all_product_buildStart 2017-10-19 23:38:57End 2017-10-19 23:53:0300:00:11 corba00:01:06 hotspot00:00:02 jaxp00:00:04 jaxws00:12:41 jdk00:00:02 langtools00:14:06 TOTAL-------------------------
Hotspot
- 进入
OpenJDK目录/hotspot/make
,复制environment.sh
,依次运行source environment.sh
,make
- Hotspot的编译与JDK的编译大体相似,但还是有所不同,主要修改的还是
environment.sh
- 如果是64位系统,在最后加上
export ARCH_DATA_MODEL=64
,否则会在编译过程中提示部分头文件找不到 - 编译的输出路径建议进行修改,不然jdk与hotspot的编译输出都会放在
build
下面,比较难分辨 - 编译完成后可以去
linux_amd64_compiler2/fastdebuf
下修改env.sh
,添加
LD_LIBRART_PATH=.:{JAVA_HOME}/jre/lib/amd64/native_threads:%{JAVA_HOME}/jre/lib/amd64:
export LD_LIBRARY_PATH
然后依次运行source env.sh
,./gamma -version
,如果编译成功,就能看到结果。
Netbeans
- 去到Netbeans官网下载最新版本并安装
- Netbeans 源码调试教程
该教程中有些地方与本文的介绍不太合适,这里是更正:
- Pre-Build Action: 此处输入的命令应为
./environment.sh
- Build-Action: 此处
Build Command
应该是${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=environment.sh中的ALT_BOOTDIR ARCH_DATA_MODEL=64 LANG=C
- Pre-Build Action: 此处输入的命令应为
Netbeans下编译好的文件将会存放在
OpenJDK目录/hotspot/build/linux/linux_amd64_compiler2/jvmg
下。
错误
This OS is not supported
,可以使用这个方法:
修改hotspot/make/linux/Makefile,找到SUPPORTED_OS_VERSION变量定义的地方,在后面追加4%
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%gamma
相关的错误,参见这里的编译错误一
进入
hotspot/src/share/vm/gc_implementation/g1
修改g1SATBCardTableModRefBS.cpp
修改内容如下(67行开始):
template <class T> voidG1SATBCardTableModRefBS::write_ref_array_pre_work(T* dst, int count) { if (!JavaThread::satb_mark_queue_set().is_active()) return; T* elem_ptr = dst; for (int i = 0; i < count; i++, elem_ptr++) { T heap_oop = oopDesc::load_heap_oop(elem_ptr); if (!oopDesc::is_null(heap_oop)) { enqueue(oopDesc::decode_heap_oop_not_null(heap_oop)); } }}//2017-10-19 Vicent_Chen addedvoid G1SATBCardTableModRefBS::write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); }}void G1SATBCardTableModRefBS::write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); }}//2017-10-19 Vicent_Chen added
修改
g1SATBCardTableModRefBS.hpp
修改内容如下:(87行开始)
template <class T> void write_ref_array_pre_work(T* dst, int count); // 2017-10-19 Vicent_Chen modified /* virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) { if (!dest_uninitialized) { write_ref_array_pre_work(dst, count); } } */ virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized); virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_unintialized); // 2017-10-19 Vicent_Chen modified
编译后
编译完成后Ubuntu的图形界面会有点卡,怀疑是内存泄漏,建议重启
附
#!/bin/sh# environment.sh# 语言选项,若不设置则会在编译好后出现一个HashTable的NPE错export LANG=C# Bootstrap JDK的安装路径export ALT_BOOTDIR=#JDK安装路径(上文提到的Oracel JDK安装路径)# 允许自动下载依赖export ALLOW_DOWNLOADS=true# 并行编译线程数,设置为和CPU内核数一样即可export HOTSPOT_BUILD_JOBS=4export ALT_PARALLEL_COMPILE_JOBS=4# 比较本次build出来的映像与先前版本的差异。这对我们来说没有意义# 必须设置为false,否则sanity检查会报缺少先前版本JDK的映像的错误提示# 如果已经设置 dev 或者 DEV_ONLY = true,这个不显式设置也行export SKIP_COMPARE_IMAGES=true# 使用预编译头文件,不加这个编译会慢些export USE_PRECOMPILED_HEADER=true# 要编译的内容export BUILD_LANGTOOLS=true#export BUILD_JAXP=false#export BUILD_JAXWS=false#export BUILD_CORBA=falseexport BUILD_HOTSPORT=trueexport BUILD_JDK=true# 要编译的版本# export SKIP_DEBUG_BUILD=false# export SKIP_FASTDEBUG_BUILD=true# export DEBUG_NAME=debug# 把它设置为false可以避开javaws和浏览器Java插件之类的部分的buildBUILD_DEPLOY=false# 把它设置为false就不会build出安装包,因为安装包里有奇怪的依赖项# 但即便不build出它也已经能得到完整的JDK映像,所以还是不buildBUILD_INSTALL=false# 编译结果存放路径export ALT_OUTPUTDIR= #openjdk7 路径/build# 这两个环境变量必须去掉,否则会有奇怪的事情发生unset JAVA_HOMEunset CLASSPATH# 这个环境变量是make sanity建议消除的unset LD_LIBRARY_PATH
阅读全文
0 0
- Ubuntu16.04 编译 OpenJDK7
- Ubuntu16.04中编译openjdk7
- Ubuntu16.04安装openjdk7
- Ubuntu16.04 上安装openJDK7 编译AndroidM环境
- ubuntu16.0.2LTS下编译OpenJDK7
- ubuntu10.04编译openjdk7
- ubuntu14.04编译openjdk7
- 在Ubuntu12.04编译OpenJDK7
- Ubuntu12.04 i386 编译OpenJDK7 记录
- linux ubuntu 14. 04下 OpenJdk7编译
- Windows下编译OpenJDK7
- Ubuntu 下编译 openJDK7
- fedora15 编译openjdk7
- CentOS6.5编译openjdk7
- openjdk7的编译
- Ubuntu12编译openjdk7
- ubuntu下编译openjdk7
- Mac编译OpenJDK7
- 【入门篇】logstash、elasticsearch、kibana搭建日志平台
- Vijos 1123题:均分纸牌
- Windows下Redis的安装使用
- linux设置用户、目录权限问题
- Java为何采用双亲(父类)委派模型(也叫用代理模式加载相关的类)
- Ubuntu16.04 编译 OpenJDK7
- 导入本地Excel到DataSet中
- 相机系统综述 —— ISP
- 安卓底部导航栏
- JAVA判断三角形的类型
- 【动态规划】[luoguP1736]创意吃鱼法
- android自定义软键盘-中文与英文大小切换
- 最近开发webview和前端进行文件下载和上传的一些文章
- 1、要搜索一个确切的字符串,即精确搜索,需要使用双引号引起来:path:”/app/logs/nginx/access.log” 2、如果不带引号,将会匹配每个单词:uid token 3、模糊搜