Help us understand the problem. What is going on with this article?

Cent OSでのOpenJDKのビルド方法

More than 3 years have passed since last update.

OpenJDKとは

OpenJDKとはOracleのJavaのオープンソース版です.すべての機能が含まれているわけではないようですが,ほとんどのJavaの機能が使えます.ライセンス上GPL2に限定して再頒布したいときや,Cent OS 7のようにJava 8のパッケージが提供されていないような場合やJavaFXが含まれていない場合に使えます.他には共有するコンピュータでroot権限がないときにJavaを使いたい場合に手元でビルドして持っていくことも出来ます.

OpenJDKのビルド

まずは,ビルドに必要なパッケージをインストールします.この例ではCent OS 7を前提にしていますが,Cent OS 6でもほぼ同様です.JavaのビルドにはJavaが必要ですので,Java 7もインストールしています.

sudo yum install -y autoconf automake bison flex gcc gcc-c++ gcc-gfortran kernel-devel make m4 patch tar bzip2 gzip xz file gmp-devel mpfr-devel wget rsync unzip zip java-1.7.0-openjdk-devel libXtst-devel libXt-devel libXrender-devel cups-devel alsa-lib-devel freetype-devel which ccache

JavaFXを使いたい場合には以下もインストールします.

yum install -y mercurial bison flex gperf ksh pkgconfig libpng-devel libjpeg-devel libxml2-devel libxslt-devel systemd-devel glib2-devel  gtk2-devel libXtst-devel pango-devel freetype-devel libXxf86vm-devel mesa-libGL-devel mesa-libGLU-devel mesa-libGLw-devel

次に,必要なファイルをダウンロードしてきます.公式サイトではMercurialのリポジトリをcloneしてくるように書いてありますが,そこまでは必要ないので今回はtar.gzで固められたファイルをダウンロードしてきます.ビルド番号などは適切なものに修正してください.また,ファイル名が同じになってしまうので,区別がつくようにしてください.

curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/jdk8u71-b15.tar.gz
curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/corba/archive/jdk8u71-b15.tar.gz
curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/archive/jdk8u71-b15.tar.gz
curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/archive/jdk8u71-b15.tar.gz
curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/jaxws/archive/jdk8u71-b15.tar.gz
curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/jaxp/archive/jdk8u71-b15.tar.gz
curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/langtools/archive/jdk8u71-b15.tar.gz
curl -OL http://hg.openjdk.java.net/jdk8u/jdk8u/nashorn/archive/jdk8u71-b15.tar.gz

次に,これらのファイルを展開します.まず,http://hg.openjdk.java.net/jdk8u/jdk8u/jdk8u71-b15.tar.gzからダウンロードしたものを展開します.その後,http://hg.openjdk.java.net/jdk8u/jdk8u/corba/archive/jdk8u71-b15.tar.gzからダウンロードしたものを,先ほど展開したディレクトリの中にcorbaとして展開します.これを,先ほどダウンロードした各ファイルについて行います.

圧縮ファイルの展開が終わったら,最初に展開したディレクトリにcdで移動し,

bash configure --prefix=/usr/local --with-milestone=fcs --with-update-version=71 --with-build-number=15
make all
sudo make install

を実行します.こすることで,/usr/local/jvmの中にビルドされたJavaがインストールされているはずです.

ビルドスクリプト

上で説明した手順を実行するためのスクリプトを置いておきます.すべて,同じフォルダに配置してください.その上で,get-openjdk.shを実行し,次にbuild-openjdk.shを実行するとできあがります.依存パッケージのインストールは行いませんので,それらは別にインストールしてください.

openjdk-common.sh

ARCHIVE_DIR, BUILD_DIR, JAVA_UPDATE, JAVA_BUILDNUMは適宜修正してください.

ARCHIVE_DIR=/build/openjdk-archives
BUILD_DIR=/build/openjdk-build

JAVA_UPDATE=71
JAVA_BUILDNUM=15
JAVAFX_BUILDNUM=${JAVA_BUILDNUM}

REPOSITORY_NAME=jdk8u
BASE_URL=http://hg.openjdk.java.net/jdk8u/${REPOSITORY_NAME}
BASE_FILENAME=jdk8u${JAVA_UPDATE}-b${JAVA_BUILDNUM}.tar.gz

URL=$BASE_URL/archive/$BASE_FILENAME
SUB_PROJECTS="corba hotspot jdk jaxws jaxp langtools nashorn"

JAVA_BUILD_DIR=$BUILD_DIR/openjdk8u${JAVA_UPDATE}

function run() {
    echo "$@"
    "$@" || exit 1
}

get-openjdk.sh

#!/bin/sh

source openjdk-common.sh

mkdir $ARCHIVE_DIR
pushd $ARCHIVE_DIR

curl -O ${URL} || exit 1

for i in $SUB_PROJECTS; do
  SUB_URL=$BASE_URL/$i/archive/$BASE_FILENAME
  echo "Downloading $SUB_URL"
  if [ ! -f "${i}-$BASE_FILENAME" ];then
    curl -o ${i}-$BASE_FILENAME -L "$SUB_URL" || (rm "$FILENAME"; exit 1)
  fi
done

popd

build-openjdk.sh

#!/bin/bash

source openjdk-common.sh

run mkdir -p $JAVA_BUILD_DIR

pushd $JAVA_BUILD_DIR

run tar xzf $ARCHIVE_DIR/$BASE_FILENAME
for i in $SUB_PROJECTS; do
  if [ ! -d ${REPOSITORY_NAME}-${BASE_FILENAME%.tar.gz}/$i ];then
    if [ ! -d ${i}-${BASE_FILENAME%.tar.gz} ];then
      run tar xzf $ARCHIVE_DIR/${i}-$BASE_FILENAME
    fi
    run mv ${i}-${BASE_FILENAME%.tar.gz} ${REPOSITORY_NAME}-${BASE_FILENAME%.tar.gz}/$i
  fi
done

pushd ${REPOSITORY_NAME}-${BASE_FILENAME%.tar.gz}

run bash configure --prefix=/usr/local --with-milestone=fcs --with-update-version=$JAVA_UPDATE --with-build-number=$JAVA_BUILDNUM
run make all
run sudo make install

popd
popd

run sudo rm -rf $JAVA_BUILD_DIR

JavaFXのビルド

JavaFXはJava本体とは別にビルドする必要があります.こちらはダウンロードするものが2つだけなので簡単です.ビルドにGradleが必要ですが,これは1.8である必要があります.

curl -OL http://hg.openjdk.java.net/openjfx/8u/rt/archive/8u71-b15.tar.gz
curl -OL https://downloads.gradle.org/distributions/gradle-1.8-bin.zip

次に,ビルドを行います.先ほどダウンロードした二つのファイルを展開して,適当なディレクトリに配置します.また,Gradle 1.8にパスを通しておきます.そうしたら,上の二つのうちの上の方のURLでダウンロードしたファイルを展開したディレクトリに移動し,次のコマンドを実行します.

gradle tasks
gradle projects
gradle

これが最後まで実行できればビルド完了です.次にインストールします.環境変数JAVA_HOMEを設定しておいてください.今回の例だと/usr/local/jvm/openjdk-1.8.0_71にしておくのがよいでしょう.

sudo cp -R ./build/sdk/* $JAVA_HOME/
sudo cp -R ./build/sdk/rt/* $JAVA_HOME/jre/
sudo rm -r $JAVA_HOME/rt

これにて,JavaFXのビルド&インストールが完了です.

ビルドスクリプト

OpenJDKのビルドに示したディレクトリと同じディレクトリに配置してください.また,get-javafx.shの次にbuild-javafx.shの順で実行してください.

get-javafx.sh

#!/bin/bash

source openjdk-common.sh

JAVAFX_URL=http://hg.openjdk.java.net/openjfx/8u/rt/archive/8u${JAVA_UPDATE}-b${JAVAFX_BUILDNUM}.tar.gz
GRADLE_URL=https://downloads.gradle.org/distributions/gradle-1.8-bin.zip

mkdir -p $ARCHIVE_DIR
pushd $ARCHIVE_DIR

run curl -L -O ${JAVAFX_URL}
run curl -L -O ${GRADLE_URL}

popd

build-javafx.sh

#!/bin/bash

source openjdk-common.sh
run mkdir -p $JAVA_BUILD_DIR
export JAVA_HOME=/usr/local/jvm/openjdk-1.8.0_${JAVA_UPDATE}

pushd $JAVA_BUILD_DIR
if [ ! -d rt-8u${JAVA_UPDATE}-b${JAVAFX_BUILDNUM} ]; then
    run tar xzf $ARCHIVE_DIR/8u${JAVA_UPDATE}-b${JAVAFX_BUILDNUM}.tar.gz
fi

if [ ! -d gradle-1.8 ];then
    run unzip $ARCHIVE_DIR/gradle-1.8-bin.zip
fi

export PATH=$JAVA_HOME/bin:$JAVA_BUILD_DIR/gradle-1.8/bin:$PATH

pushd rt-8u${JAVA_UPDATE}-b${JAVAFX_BUILDNUM}

sudo rm $JAVA_HOME/jre/lib/ext/jfxrt.jar

run gradle tasks
run gradle projects
run gradle

run sudo cp -R ./build/sdk/* $JAVA_HOME/
run sudo cp -R ./build/sdk/rt/* $JAVA_HOME/jre/
run sudo rm -r $JAVA_HOME/rt

popd
popd

やり残したこと

  • このビルドでは証明書の問題でHTTPSの通信が失敗するかもしれません.
  • JavaFXのビルドが公式ドキュメント通りではないので,もしかしたら何か足らないかもしれません
  • SceneBuilderもきちんとビルドして入れておきたいところですが,入っていません.
informationsea
Github: https://github.com/informationsea / Twitter: https://twitter.com/informationsea
https://informationsea.info
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした