Ubuntu 16.04 LTS 编译Openjdk 8

  • 准备工作

Openjdk 源码使用mercurial 管理,但是国内网络环境使用mercurial 速度不理想,建议手工下载源码包。

另外编译Openjdk 之前必须有一个Bootjdk,对于Openjdk 8,Bootjdk 必须是Openjdk 7u7以上版本。通过 sudo apt-get install openjdk-7-jdk 安装。

之后需要安装如下依赖:

gawk:sudo apt-get install gawk

x11:sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

cup:sudo apt-get install libcups2-dev

ant:sudo apt-get install ant

freetype:sudo apt-get install libfreetype6-dev

alsa:sudo apt-get install libasound2-dev

每个人机器环境不同,如果安装中报错有其他依赖,根据提示安装即可。

  • 编译参数

#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
export LANG=C

#Bootstrap JDK的安装路径。必须设置。
export ALT_BOOTDIR=/usr/lib/jvm/java-8-openjdk-amd64

#允许自动下载依赖
export ALLOW_DOWNLOADS=true

#并行编译的线程数,设置为和CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=4
export 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=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true

#要编译的版本
#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
#export DEBUG_NAME=debug

#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build。
BUILD_DEPLOY=false

#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。
BUILD_INSTALL=false

#编译结果所存放的路径
export ALT_OUTPUTDIR=/home/fourier/Desktop/openjdk/build/

#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些“”诡异的事情”,Makefile脚本检查到有这2个变量就会提示警告“)
unset JAVA_HOME
unset CLASSPATH

make 2>&1 | tee $ALT_OUTPUTDIR/build.log

  • 问题处理

[问题]

openjdk/hotspot/make/linux/makefiles/top.make:91: recipe for target ‘ad_stuff’ failed

[解决方案]

vim hotspot/make/linux/makefiles/adjust-mflags.sh

63 MFLAGS=`
64 echo “$MFLAGS” \
65 | sed ‘
66 s/^-/ -/
s/ -\([^ ][^ ]*\)j/ -\1 -j/
67 s/ -j[0-9][0-9]*/ -j/
68 s/ -j\([^ ]\)/ -j -\1/
69 s/ -j/ -j’${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}’/
70 ‘ `
删除这一行

[问题]

os not supported error while building hotspot

[解决方案]

change hotspot/make/linux/Makefile
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3% 4%

  • 参考:

http://hadwinzhy.github.io/2013/01/21/compile-jdk/

https://focusvirtualization.blogspot.com/2016/11/current-java-version-on-my-ubuntu-gcc.html

http://www.linuxidc.com/Linux/2016-08/134267.htm

使用Gitblit搭建局域网Git服务器

软件的使用、安装请参考

http://www.cnblogs.com/hujunzheng/p/4970411.html

按照上面文章,在使用中遇到两个问题:

1,在注册服务后发现无法启动服务,报错提示:

Failed creating java

原因是64位Java 的jvm 路径不对,导致服务启动时无法拉起java 虚拟机

解决方案:调整为32位模式重新注册服务

2,服务启动后,Windows 本地可以正常访问,局域网中的其他设备无法访问

原因是Windows 防火墙拦截了局域网请求

解决方案:在入站规则中对开放端口添加例外即可

Android开发Log–Unable to instantiate activity ComponentInfo 异常

今天调试2048程序准备给它写个AI,本来跑的挺正常的程序突然蹦出了个异常:

08-17 13:46:20.158: E/AndroidRuntime(25840): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{in.fourier.game/in.fourier.game2048.MainActivity}: java.lang.ClassNotFoundException: in.fourier.game2048.MainActivity

代码完全挂了,Debug 跑步起来,在MainActivity.onCreate() 打断点也走不进去。

去问了一下万能的StackOverFlow ,群众纷纷表示是Activity 没有在Manifest 注册导致的,仔细看了一下我的代码也没有这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="in.fourier.game2048.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

天哪!谁来告诉我WP-Syntax 这个插件为什么不能正常一点!:-(

还有人表示这个是因为Activity 里面复写了onCreate() ,同时又有构造方法。检视了一下没有这问题。

挺无奈的,浪费了半小时的功夫还没搞定,最后只能祭出大杀器:

delete-gen

删除选中的两个目录,再重新Build 一下,问题解决。

仔细想了一下,有可能是我修改了包名造成的。虽然Eclipse 的重构功能已经很强大,可以匹配相同的字符串做替换,但是还是出了这问题。

莫名其妙的出现,莫名其妙的消失,还是我太年轻啊。

以上备忘。