参考

http://gvsmirnov.ru/blog/tech/2014/02/07/building-openjdk-8-on-osx-maverick.html

前言

最近面试经常被文档java垃圾回收,虚拟机相关的问题,想想自己早前买了一本《深入理解Java虚拟机》从来没有好好看过,现在开始带着问题把它好好读读。不过按照书中的方法编译openjdk不成功。参考了上面的链接终于完成了编译。

步骤

一.源码安装包准备

  • homebrew,mac系统的包管理器
  • mercurial,openJDK的代码版本管理工具,从来没用过。。。

    可以使用brew安装。

      brew install mercurial
    

    有了代码管理工具就可以下载源码了

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

    全部clone到本地后,进入openjdk8目录,打开README文件,发现上面语句下载的只是java根资源下面的内容,按照提示还需要继续下载其他资源

    	cd openjdk8 && sh ./get_source.sh
      
    继续看README的介绍
      	
    编译java还需要:
      	
    * make的版本再3.81以上
    * 需要jdk7u7版本以上的Jdk
    

    更详细的一些信息需要看README-builds.html文件。

二.配置环境准备

README-builds.html文件里面说明了在linux,solaris,windows,mac4种主要系统种编译Java的环境参考。 其中对mac的说明很少

Install XCode 4.5.2 and also install the "Command line tools" found under the preferences pane "Downloads"

只有上面这一句,看似很简单其实不然,因为xcode 4.5是很老的mac系统使用的,目前新的系统已经无法安装了。。。而最新版本的xcode因为gcc版本的问题,无法编译java源码,直接编译会出现下面的错误。

configure: error: GCC compiler is required. Try setting --with-tools-dir.

所以我们需要使用其他的gcc来代替默认的,

brew install homebrew/dupes/apple-gcc42
sudo mkdir /usr/bin/backup && sudo mv /usr/bin/gcc /usr/bin/g++ /usr/bin/backup
$ sudo ln -s /usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2 /usr/bin/gcc
$ sudo ln -s /usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/g++-4.2 /usr/bin/g++

之后执行

bash ./configure

可能会出现这个错误

configure: error: Could not find freetype!
configure exiting with result code 1

这个需要你下载xquartz,这个是绘图相关的一个软件。

安装好后继续执行

bash ./configure

配置成功!

接下来我们可以正式编译了

三.编译过程

执行

make

发现和参考的网页中出现同样的错误

hotspot/src/os/bsd/vm/os_bsd.cpp:1150:7: error: "__FreeBSD__" is not defined [-Werror=undef]
hotspot/src/os/bsd/vm/os_bsd.cpp:1152:7: error: "__OpenBSD__" is not defined [-Werror=undef]
hotspot/src/os/bsd/vm/os_bsd.cpp:1154:7: error: "__NetBSD__" is not defined [-Werror=undef]

按照如下步骤解决

pushd hotspot
curl https://gist.githubusercontent.com/gvsmirnov/8664413/raw > saproc_make_fobjc_exceptions_flag_fix.patch
hg import saproc_make_fobjc_exceptions_flag_fix.patch
popd

继续执行

make
…
----- Build times -------
Start 2014-02-06 21:20:36
End   2014-02-06 21:30:50
00:00:18 corba
00:06:57 hotspot
00:00:13 jaxp
00:00:18 jaxws
00:02:03 jdk
00:00:25 langtools
00:10:14 TOTAL
-------------------------
Finished building OpenJDK for target 'default'

成功了!参考得网页里面还遇到了其他得问题,应该是不同系统和不同源码版本导致得,如果各位遇到上面描述以外得问题可以去看下。

之后可以配置下环境变量使电脑使用你刚刚编译的java

vim ~/.bash_profile

export JAVA_HOME=/Users/mls-pc/projects/YourOpenJDKPath/build/macosx-x86_64-normal-server-release/jdk

source ~/.bash_profile

java -version

openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-mlspc_2016_04_02_09_03-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70, mixed mode)

自己编译的jdk会显示你编译的时间在本版后面


背景

jenkins是一个用来做自动部署和项目构建的工具;

github是流行的开源代码托管服务。

将代码放置在github上之后使用jenkins自动拉取代码到本地并发布是很常用的远程部署模式。

本文纪录了自己用jenkins来发布node程序的步骤。

前期准备

  1. 安装jenkins:https://jenkins.io/download/, 并启动服务。

jenkins icon

配置jenkins的github插件

进入到Jenkins->Manage Jenkins->Manage plugins搜索github并安装GitHub plugin即可

新建项目

  1. 源码管理->git
    • Repository URL:填写github的工程路径
    • 其他默认
  2. 构建触发器
    • 选择Build when a change is pushed to GitHub
    • 选择Poll SCM 并填写[H/2 * * * *](两分钟检查一次)
  3. 构建
    • 选择execute shell,之后在后面根据你的项目性质去写脚本,我的例子很简单:

        nohup node server.js > nohup.log & #启动一个node服务
      
    注意:
    这个地方需要注意,jenkins全部构建结束后会使用[ProcessTreeKiller](https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller) 将当前构建任务的进程及子进程全部杀掉,这样做的原因是担心不清楚所有进程会造成任务见和前后两次构建间互相干扰。 但是我们实际用的时候常常是使用jenkins自动构建后,还要根据业务进行黑盒测试等,所以需要保证服务进程不被杀掉,因此在最前面加入BUILD_ID=dontKillMe这个语句,这样服务的语句不会随着构建结束而停止。

参考

自己的建立过程主要参照了下面两个链接的内容

  1. 阮一峰老师的介绍:[搭建一个免费的,无限流量的Blog—-github Pages和Jekyll入门][ruan]
  2. github官方的指引:https://pages.github.com/ [ruan]:http://www.ruanyifeng.com/blog/2012/08/blogging_with_jekyll.html

创建blog用的仓库

1.创建一个已自己用户ID开头的reposiory

例:xiagn825.github.io

2.clone工程到本地

git clone https://github.com/username/username.github.io

3.进入项目目录,新建index.html文件,并随意添加些内容进去

cd username.github.io
echo "Hello World" > index.html

4.上传文件到远程仓库

git add --all
git commit -m "Initial commit"
git push -u origin master

5.之后就可以在浏览器中输入远程仓库的名字进行查看

使用jekyll管理你的blog

jekyll介绍:http://jekyllrb.com/

安装jekyll

  1. 安装ruby:因为jekyll是基于ruby的。
    官方下载地址:https://www.ruby-lang.org/zh_cn/downloads/

  2. 安装bundler:gem install bundler。 如果一直出现网络问题不能安装,请参考这里的解决方案

  3. 安装jekyll:在安装之前先要创建ruby的安装文件Gemfile,其内容如下

     source 'https://rubygems.org'
     gem 'github-pages'
    

之后执行bundle install完成jekyll的安装

运行jekyll

在项目根目录输入bundle exec jekyll serve就可以运行jekyll,浏览器中输入 http://localhost:4000就能把index.html的内容显示出来。

配置jekyll

  1. 创建jekyll的配置文件_config.yml
  2. 创建用来存放模版的目录_layouts,在目录内创建default.html.其中创建默认的blog模版。

     参考内容:
     <!DOCTYPE html>
     <html>
     <head>
         <meta http-equiv="content-type" content="text/html; charset=utf-8" />
         <title>{{ page.title }}</title>
     </head>
     <body>
         {{ content }}
     </body>
     </html>
    
  3. 创建_post目录用来存放blog内容
    进入该目录,创建第一篇文章。文章就是普通的文本文件,文件名假定为2012-08-25-hello-world.html。(注意,文件名必须为”年-月-日-文章标题.后缀名”的格式。如果网页代码采用html格式,后缀名为html;如果采用markdown格式,后缀名为md。)

     ---
     layout: default
     title: 你好,世界
     ---
     <h2>{{ page.title }}</h2>
     <p>我的第一篇文章</p>
     <p>{{ page.date | date_to_string }}</p>
    
  4. 修改首页
    修改原来简单的index.html文件

     ---
     layout: default
     title: 我的Blog
     ---
     <h2>{{ page.title }}</h2>
     <p>最新文章</p>
     <ul>
     {% for post in site.posts %}
     <li>{{ post.date | date_to_string }} <a href="{{ site.baseurl }}{{ post.url}}">{{ post.title }}</a></li>
     {% endfor %}
     </ul>
    
  5. 执行jeykll编译,在本地查看效果

     jeykll build
    
  6. 确认效果后将代码提交到远程仓库,确认效果。

     git add --all
     git commit -m "update layout"
     git push -u origin master
    
  7. 如果要进一步美化自己的blog请到这里下载jekyll皮肤 或根据jeykll的语法自行美化。