© 2019 NTT DATA Corporation 1 © 2019 NTT DATA Corporation
OpenJDKの開発環境
2019年11月23日
株式会社NTTデータ 末永 恭正
#jjug_ccc #ccc_a6b
© 2019 NTT DATA Corporation 2 #jjug_ccc #ccc_a6b
https://www.oracle.com/technetwork/jp/articles/java/ja-topics/jdk-release-model-4487660-ja.html
© 2019 NTT DATA Corporation 3 #jjug_ccc #ccc_a6b
Java使いたいんだって?
もちろん(Javaも)ちゃんと面倒見てくれるんだよね?
Javaで書くのは全然構わないっすけど
何使えばいいっすかね
© 2019 NTT DATA Corporation 4 #jjug_ccc #ccc_a6b
© 2019 NTT DATA Corporation 5 #jjug_ccc #ccc_a6b
もう自分で作っちゃおうかな…
© 2019 NTT DATA Corporation 6 #jjug_ccc #ccc_a6b
オレ流 … 誰流?
• 末永 恭正 @YaSuenag
• NTTデータでJavaやってるサンデープログラマー
• OpenJDK Reviewer
• IcedTea Committer
• Linux x64とWindows x64向けJDKをビルドした経験あり
今回のお話の前提条件にします!
※JDKは13以降を対象にします
© 2019 NTT DATA Corporation 7 #jjug_ccc #ccc_a6b
そんなにクセのないOpenJDKビルド
① ソースのダウンロード
② 必要なソフト類の準備
③ configure
④ make
一般的なOSSのビルドとあまり変わらない!
© 2019 NTT DATA Corporation 8 #jjug_ccc #ccc_a6b
① ソースのダウンロード
② 必要なソフト類の準備
③ configure
④ make
© 2019 NTT DATA Corporation 9 #jjug_ccc #ccc_a6b
ソースコードの入手
• 基本は公式リポジトリからのclone
• SCMはMercurial
• ブラウザからダウンロードも可能
$ hg clone http://hg.openjdk.java.net/jdk/jdk/
© 2019 NTT DATA Corporation 10 #jjug_ccc #ccc_a6b
入手元
• JDK開発リポジトリ
• http://hg.openjdk.java.net/jdk/jdk/
• JDK 8 Updates
• http://hg.openjdk.java.net/jdk8u/jdk8u/
• JDK Updates ※JDK 10以降
• http://hg.openjdk.java.net/jdk-updates
• この下の階層に「jdk<メジャーバージョン>u」の形で
バージョン別アップデートが存在
© 2019 NTT DATA Corporation 11 #jjug_ccc #ccc_a6b
詳細バージョン指定
tagsから指定可能
© 2019 NTT DATA Corporation 12 #jjug_ccc #ccc_a6b
① ソースのダウンロード
② 必要なソフト類の準備
③ configure
④ make
© 2019 NTT DATA Corporation 13 #jjug_ccc #ccc_a6b
環境
Windows 10 Professional
WSL
Hyper-V
Windows版ビルド環境Linux版ビルド環境
オレ流
© 2019 NTT DATA Corporation 14 #jjug_ccc #ccc_a6b
必要なソフト類の準備
• GCC
• GNU make、Autoconf
• 様々なライブラリ
• JDK
– ディストロ配布のものでOK
– Fedoraなら
java-latest-openjdk-devel
• WSL
– Ubuntu 18.04のストアアプリ
– JDK 13からWSLでビルド可能、
WSL 2はJDK 14から
– オフィシャルな
Windows版JDKのビルド環境はCygwin
• ほぼLinuxと同じライブラリ、ソフト類
– コンパイラ類はVisual Studio
(Community Edition可)
• JDKはWindows版JDK
– jdk.java.netのOpenJDK
オレ流
Windows版ビルド環境Linux版ビルド環境
© 2019 NTT DATA Corporation 15 #jjug_ccc #ccc_a6b
ビルドに関する情報
<JDKソース>/docs/building.{md,html}
© 2019 NTT DATA Corporation 16 #jjug_ccc #ccc_a6b
公式ビルド環境
https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms
© 2019 NTT DATA Corporation 17 #jjug_ccc #ccc_a6b
① ソースのダウンロード
② 必要なソフト類の準備
③ configure
④ make
© 2019 NTT DATA Corporation 18 #jjug_ccc #ccc_a6b
③configure
• デバッグ版 ※fastdebug
• リリース版
$ bash configure -–enable-debug 
--with-native-debug-symbols=internal 
--disable-warnings-as-errors
$ bash configure --with-native-debug-symbols=internal 
--disable-hotspot-gtest 
--disable-warnings-as-errors
オレ流
© 2019 NTT DATA Corporation 19 #jjug_ccc #ccc_a6b
configureオプション
• --enable-debug
• デバッグVM(fastdebug)をビルドする
• --with-native-debug-symbols
• デバッグ情報の扱いを決める
• デフォルト※はexternal、デバッグしやすさでinternal
• rpmbuildと絡める場合は絶対internal!
• --disable-warnings-as-errors
• 警告をビルドエラーとして扱わない
• 特に新しいC/C++コンパイラを使う場合は指定をオススメ
• --disable-hotspot-gtest
• Google Test関連ソースをビルドしない
• 日本語環境のWindowsでは必須(JDK-8216154関連)
※プラットフォームにより異なります
デバッグ版
デバッグ版 リリース版
デバッグ版 リリース版
リリース版
© 2019 NTT DATA Corporation 20 #jjug_ccc #ccc_a6b
configureで出るエラー例
• GNU makeがない
• 必要なライブラリがない
configure: error: Cannot find GNU make 3.81 or newer!
Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make
as argument to configure.
Fedoraなら`dnf install make`で対処
configure: error: Could not find X11 libraries.
You might be able to fix this by running
'sudo yum install libXtst-devel libXt-devel libXrender-devel
libXrandr-devel libXi-devel'.
対処方法
© 2019 NTT DATA Corporation 21 #jjug_ccc #ccc_a6b
configureで出るエラー例
• Boot JDKが見つからない
• Boot JDKが古い
configure: Could not find a valid Boot JDK.
OpenJDK distributions are available at http://jdk.java.net/.
configure: error: Cannot continue
configure: This might be fixed by explicitly setting --with-boot-jdk
configure: Potential Boot JDK found at /usr/lib/jvm/java-1.8.0-openjdk
is incorrect JDK version (openjdk version "1.8.0_232"); ignoring
configure: (Your Boot JDK version must be one of: 13 14)
configure: error: The path given by --with-boot-jdk does not contain
a valid Boot JDK
© 2019 NTT DATA Corporation 22 #jjug_ccc #ccc_a6b
Boot JDK
• JDKビルドの一部で使用するJDK
• JDKがありそうな場所からconfigureが自動で探し出す
• Linux:/usr/lib/jvm
• Windows:Program Files
• ビルドしようとするバージョンの1世代前までが必須
• 例:JDK 14をビルドするならJDK 13かJDK 14 EAが必要
• 時期によって2世代前まで指定できる場合もあり
• --with-boot-jdk=<フルパス>でconfigureに指定可能
• WindowsではWindowsプログラムから見えるところ
(/mnt/c/とかdrvfs配下のどこか)に展開しておく必要がある
© 2019 NTT DATA Corporation 23 #jjug_ccc #ccc_a6b
① ソースのダウンロード
② 必要なソフト類の準備
③ configure
④ make
© 2019 NTT DATA Corporation 24 #jjug_ccc #ccc_a6b
④make
$ make product-bundles
• JDKを作る
• 配布用アーカイブまで作る
$ make images
<JDKソース>/build/<configure設定>/images/jdk
<JDKソース>/build/<configure設定>/bundles
© 2019 NTT DATA Corporation 25 #jjug_ccc #ccc_a6b
build/linux-x86_64-server-release/bundles/
├── jdk-14-internal+0_linux-x64_bin-symbols.tar.gz
├── jdk-14-internal+0_linux-x64_bin-tests-demos.tar.gz
└── jdk-14-internal+0_linux-x64_bin.tar.gz
product-bundlesで作られるアーカイブ
① デバッグ情報
② サンプルプログラム
③ JDK本体
①
②
③
© 2019 NTT DATA Corporation 26 #jjug_ccc #ccc_a6b
注意すべきこと
• 配布先(実行環境)によっては動かないことがある
• 例1:Fedora 31でビルドしたものはCentOS 6で動かない
• 例2:CentOS 6でビルドしたものはAlpineで動かない
• デバッグ情報は大事に保管しておく
• ソースコードも大事に取っておく
• configureオプションもきちんと取っておく
• build/<configure設定>/configure.log
© 2019 NTT DATA Corporation 27 #jjug_ccc #ccc_a6b
$ java --version
openjdk 14-internal 2020-03-17
OpenJDK Runtime Environment (build 14-internal+0-adhoc.ysuenaga.jdk)
OpenJDK 64-Bit Server VM
(build 14-internal+0-adhoc.ysuenaga.jdk, mixed mode, sharing)
© 2019 NTT DATA Corporation 28 #jjug_ccc #ccc_a6b
$ java -XshowSettings:properties 2>&1 | grep vendor
java.specification.vendor = Oracle Corporation
java.vendor = N/A
java.vendor.url = https://openjdk.java.net/
java.vendor.url.bug = https://bugreport.java.com/bugreport/
java.vm.specification.vendor = Oracle Corporation
java.vm.vendor = Oracle Corporation
© 2019 NTT DATA Corporation 29 #jjug_ccc #ccc_a6b
• ベンダ名を正しく設定
• 各種URLも正しく設定
• ベンダURLとバグ報告URLの違いに注意
• バグ報告URLは全体とVMの2種類が存在
• 各種バージョンはお好みに
より製品版らしくするconfigureオプション
© 2019 NTT DATA Corporation 30 #jjug_ccc #ccc_a6b
より製品版らしくするconfigureオプション
OpenJDK Runtime Environment (build 14.0.0.1+2-TypeS)
--with-version-feature
--with-version-interim
--with-version-update
--with-version-patch
--with-version-build
--with-version-opt
※--with-version-preは空文字列(’’)をセット
© 2019 NTT DATA Corporation 31 #jjug_ccc #ccc_a6b
build/linux-x86_64-server-release/bundles/
├── jdk-14.0.0.1+2_linux-x64_bin-symbols.tar.gz
├── jdk-14.0.0.1+2_linux-x64_bin-tests-demos.tar.gz
└── jdk-14.0.0.1+2_linux-x64_bin.tar.gz
成果物のファイル名へも反映される
$ tar tvfz jdk-14.0.0.1+2_linux-x64_bin.tar.gz
-rwxrwxr-x ysuenaga/ysuenaga 18896 2019-11-12 10:23 jdk-14.0.0.1/bin/jaotc
-rwxrwxr-x ysuenaga/ysuenaga 18792 2019-11-12 10:23 jdk-14.0.0.1/bin/jar
-rwxrwxr-x ysuenaga/ysuenaga 18800 2019-11-12 10:23 jdk-14.0.0.1/bin/jarsigner
-rwxrwxr-x ysuenaga/ysuenaga 18760 2019-11-12 10:23 jdk-14.0.0.1/bin/java
© 2019 NTT DATA Corporation 32 #jjug_ccc #ccc_a6b
より製品版らしくするconfigureオプション
java.vm.vendor=NTT DATA
java.vendor=NTT DATA
java.vendor.url=https://oss.nttdata.com/
java.vendor.url.bug=https://oss.nttdata.com/bugreport/
--with-vendor-name --with-vendor-url
--with-vendor-bug-url
© 2019 NTT DATA Corporation 33 #jjug_ccc #ccc_a6b
クラッシュレポート(hs_errログ)の例
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007ff33dea4b25 (sent by kill), pid=58807, tid=58807
#
# JRE version: OpenJDK Runtime Environment (14.0.1+2) (build 14.0.0.1+2-TypeS)
# Java VM: OpenJDK 64-Bit Server VM (14.0.0.1+2-TypeS, mixed mode, sharing, tiered,
compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# C [libpthread.so.0+0xab25] __GI___pthread_timedjoin_ex+0x215
#
# Core dump will be written. Default location: Core dumps may be processed with
"/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h" (or dumping to
/home/ysuenaga/test/LongSleep/core.58807)
#
# If you would like to submit a bug report, please visit:
# https://oss.nttdata.com/bugreport/jvm/
--with-vendor-vm-bug-url
JDK-8233785
© 2019 NTT DATA Corporation 34 #jjug_ccc #ccc_a6b
もらったJDK使ってるけど、
なんか動かないんだよね…
うわ、バグだ…
© 2019 NTT DATA Corporation 35 #jjug_ccc #ccc_a6b
デバッグ
• 基本はメモリダンプでネイティブデバッガ
• LinuxならGDB、WindowsならVisual StudioかWinDbg
• デバッグ情報を実行バイナリと同じ場所へ展開
• Windowsではフルダンプを取得するよう設定するのがオススメ
• Javaレイヤからも追っていく場合はjhsdbが便利
• 詳細はこちら
© 2019 NTT DATA Corporation 36 #jjug_ccc #ccc_a6b
OpenJDKコミュニティ
• バグ登録はOpenJDKコミュニティで
権限をもっていないとできない
• Authorと呼ばれるロール以上を保持する人のみ
• GitHubはあくまでミラーリポジトリ
• JDKについてはIssueやPRを受け付けない
• メールで勝負!
© 2019 NTT DATA Corporation 37 #jjug_ccc #ccc_a6b
パッチ出し
1. バグ、改善内容を見つける
2. 既知のものでないか確認する
• https://bugs.openjdk.java.net/
3. コードを修正し、パッチを作る
4. パッチをメールにベタ書きしてMLへ投稿!
$ hg diff
© 2019 NTT DATA Corporation 38 #jjug_ccc #ccc_a6b
うまくやるコツ:正しい出し先を選ぶ!
http://mail.openjdk.java.net/mailman/listinfo
© 2019 NTT DATA Corporation 39 #jjug_ccc #ccc_a6b
パッチ等、JDKのテストをしたい場合
1. jtregをダウンロードし、展開する
• https://ci.adoptopenjdk.net/view/Dependencies/job/jtreg/
2. $JT_HOMEにjtregディレクトリを、
$JT_JAVAにテスト対象のJDKディレクトリを設定する
3. JDKをmake test-imageする
• Google Testも有効化(--disable-hotspot-gtestを付けない)
• デバッグビルドするのがオススメ
4. 目的のテストケースを実行する
$ $JT_HOME/bin/jtreg -ignore:quiet -exclude:ProblemList.txt 
-nativepath:<ビルドディレクトリ>/support/test/<テスト対象>/jtreg/native/lib 
<テストケース>
© 2019 NTT DATA Corporation 40 #jjug_ccc #ccc_a6b
まとめ
• 基本はconfigure→make
• ソースはhg.openjdk.java.netから!
• configureオプションでバージョン番号などもしっかり設定!
• エラーが出たらconfigureの指示に従う
• アーカイブまで作るときはmake product-bundles
• 配布する場合は、配布先の実行環境に注意!
• ビルド時の情報や生成物は大事に保管しておく
• コミュニティへ報告をする場合は送信先MLに注意
• パッチを作るときはhg diff
© 2019 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)

  • 1.
    © 2019 NTTDATA Corporation 1 © 2019 NTT DATA Corporation OpenJDKの開発環境 2019年11月23日 株式会社NTTデータ 末永 恭正 #jjug_ccc #ccc_a6b
  • 2.
    © 2019 NTTDATA Corporation 2 #jjug_ccc #ccc_a6b https://www.oracle.com/technetwork/jp/articles/java/ja-topics/jdk-release-model-4487660-ja.html
  • 3.
    © 2019 NTTDATA Corporation 3 #jjug_ccc #ccc_a6b Java使いたいんだって? もちろん(Javaも)ちゃんと面倒見てくれるんだよね? Javaで書くのは全然構わないっすけど 何使えばいいっすかね
  • 4.
    © 2019 NTTDATA Corporation 4 #jjug_ccc #ccc_a6b
  • 5.
    © 2019 NTTDATA Corporation 5 #jjug_ccc #ccc_a6b もう自分で作っちゃおうかな…
  • 6.
    © 2019 NTTDATA Corporation 6 #jjug_ccc #ccc_a6b オレ流 … 誰流? • 末永 恭正 @YaSuenag • NTTデータでJavaやってるサンデープログラマー • OpenJDK Reviewer • IcedTea Committer • Linux x64とWindows x64向けJDKをビルドした経験あり 今回のお話の前提条件にします! ※JDKは13以降を対象にします
  • 7.
    © 2019 NTTDATA Corporation 7 #jjug_ccc #ccc_a6b そんなにクセのないOpenJDKビルド ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make 一般的なOSSのビルドとあまり変わらない!
  • 8.
    © 2019 NTTDATA Corporation 8 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  • 9.
    © 2019 NTTDATA Corporation 9 #jjug_ccc #ccc_a6b ソースコードの入手 • 基本は公式リポジトリからのclone • SCMはMercurial • ブラウザからダウンロードも可能 $ hg clone http://hg.openjdk.java.net/jdk/jdk/
  • 10.
    © 2019 NTTDATA Corporation 10 #jjug_ccc #ccc_a6b 入手元 • JDK開発リポジトリ • http://hg.openjdk.java.net/jdk/jdk/ • JDK 8 Updates • http://hg.openjdk.java.net/jdk8u/jdk8u/ • JDK Updates ※JDK 10以降 • http://hg.openjdk.java.net/jdk-updates • この下の階層に「jdk<メジャーバージョン>u」の形で バージョン別アップデートが存在
  • 11.
    © 2019 NTTDATA Corporation 11 #jjug_ccc #ccc_a6b 詳細バージョン指定 tagsから指定可能
  • 12.
    © 2019 NTTDATA Corporation 12 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  • 13.
    © 2019 NTTDATA Corporation 13 #jjug_ccc #ccc_a6b 環境 Windows 10 Professional WSL Hyper-V Windows版ビルド環境Linux版ビルド環境 オレ流
  • 14.
    © 2019 NTTDATA Corporation 14 #jjug_ccc #ccc_a6b 必要なソフト類の準備 • GCC • GNU make、Autoconf • 様々なライブラリ • JDK – ディストロ配布のものでOK – Fedoraなら java-latest-openjdk-devel • WSL – Ubuntu 18.04のストアアプリ – JDK 13からWSLでビルド可能、 WSL 2はJDK 14から – オフィシャルな Windows版JDKのビルド環境はCygwin • ほぼLinuxと同じライブラリ、ソフト類 – コンパイラ類はVisual Studio (Community Edition可) • JDKはWindows版JDK – jdk.java.netのOpenJDK オレ流 Windows版ビルド環境Linux版ビルド環境
  • 15.
    © 2019 NTTDATA Corporation 15 #jjug_ccc #ccc_a6b ビルドに関する情報 <JDKソース>/docs/building.{md,html}
  • 16.
    © 2019 NTTDATA Corporation 16 #jjug_ccc #ccc_a6b 公式ビルド環境 https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms
  • 17.
    © 2019 NTTDATA Corporation 17 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  • 18.
    © 2019 NTTDATA Corporation 18 #jjug_ccc #ccc_a6b ③configure • デバッグ版 ※fastdebug • リリース版 $ bash configure -–enable-debug --with-native-debug-symbols=internal --disable-warnings-as-errors $ bash configure --with-native-debug-symbols=internal --disable-hotspot-gtest --disable-warnings-as-errors オレ流
  • 19.
    © 2019 NTTDATA Corporation 19 #jjug_ccc #ccc_a6b configureオプション • --enable-debug • デバッグVM(fastdebug)をビルドする • --with-native-debug-symbols • デバッグ情報の扱いを決める • デフォルト※はexternal、デバッグしやすさでinternal • rpmbuildと絡める場合は絶対internal! • --disable-warnings-as-errors • 警告をビルドエラーとして扱わない • 特に新しいC/C++コンパイラを使う場合は指定をオススメ • --disable-hotspot-gtest • Google Test関連ソースをビルドしない • 日本語環境のWindowsでは必須(JDK-8216154関連) ※プラットフォームにより異なります デバッグ版 デバッグ版 リリース版 デバッグ版 リリース版 リリース版
  • 20.
    © 2019 NTTDATA Corporation 20 #jjug_ccc #ccc_a6b configureで出るエラー例 • GNU makeがない • 必要なライブラリがない configure: error: Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure. Fedoraなら`dnf install make`で対処 configure: error: Could not find X11 libraries. You might be able to fix this by running 'sudo yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel'. 対処方法
  • 21.
    © 2019 NTTDATA Corporation 21 #jjug_ccc #ccc_a6b configureで出るエラー例 • Boot JDKが見つからない • Boot JDKが古い configure: Could not find a valid Boot JDK. OpenJDK distributions are available at http://jdk.java.net/. configure: error: Cannot continue configure: This might be fixed by explicitly setting --with-boot-jdk configure: Potential Boot JDK found at /usr/lib/jvm/java-1.8.0-openjdk is incorrect JDK version (openjdk version "1.8.0_232"); ignoring configure: (Your Boot JDK version must be one of: 13 14) configure: error: The path given by --with-boot-jdk does not contain a valid Boot JDK
  • 22.
    © 2019 NTTDATA Corporation 22 #jjug_ccc #ccc_a6b Boot JDK • JDKビルドの一部で使用するJDK • JDKがありそうな場所からconfigureが自動で探し出す • Linux:/usr/lib/jvm • Windows:Program Files • ビルドしようとするバージョンの1世代前までが必須 • 例:JDK 14をビルドするならJDK 13かJDK 14 EAが必要 • 時期によって2世代前まで指定できる場合もあり • --with-boot-jdk=<フルパス>でconfigureに指定可能 • WindowsではWindowsプログラムから見えるところ (/mnt/c/とかdrvfs配下のどこか)に展開しておく必要がある
  • 23.
    © 2019 NTTDATA Corporation 23 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  • 24.
    © 2019 NTTDATA Corporation 24 #jjug_ccc #ccc_a6b ④make $ make product-bundles • JDKを作る • 配布用アーカイブまで作る $ make images <JDKソース>/build/<configure設定>/images/jdk <JDKソース>/build/<configure設定>/bundles
  • 25.
    © 2019 NTTDATA Corporation 25 #jjug_ccc #ccc_a6b build/linux-x86_64-server-release/bundles/ ├── jdk-14-internal+0_linux-x64_bin-symbols.tar.gz ├── jdk-14-internal+0_linux-x64_bin-tests-demos.tar.gz └── jdk-14-internal+0_linux-x64_bin.tar.gz product-bundlesで作られるアーカイブ ① デバッグ情報 ② サンプルプログラム ③ JDK本体 ① ② ③
  • 26.
    © 2019 NTTDATA Corporation 26 #jjug_ccc #ccc_a6b 注意すべきこと • 配布先(実行環境)によっては動かないことがある • 例1:Fedora 31でビルドしたものはCentOS 6で動かない • 例2:CentOS 6でビルドしたものはAlpineで動かない • デバッグ情報は大事に保管しておく • ソースコードも大事に取っておく • configureオプションもきちんと取っておく • build/<configure設定>/configure.log
  • 27.
    © 2019 NTTDATA Corporation 27 #jjug_ccc #ccc_a6b $ java --version openjdk 14-internal 2020-03-17 OpenJDK Runtime Environment (build 14-internal+0-adhoc.ysuenaga.jdk) OpenJDK 64-Bit Server VM (build 14-internal+0-adhoc.ysuenaga.jdk, mixed mode, sharing)
  • 28.
    © 2019 NTTDATA Corporation 28 #jjug_ccc #ccc_a6b $ java -XshowSettings:properties 2>&1 | grep vendor java.specification.vendor = Oracle Corporation java.vendor = N/A java.vendor.url = https://openjdk.java.net/ java.vendor.url.bug = https://bugreport.java.com/bugreport/ java.vm.specification.vendor = Oracle Corporation java.vm.vendor = Oracle Corporation
  • 29.
    © 2019 NTTDATA Corporation 29 #jjug_ccc #ccc_a6b • ベンダ名を正しく設定 • 各種URLも正しく設定 • ベンダURLとバグ報告URLの違いに注意 • バグ報告URLは全体とVMの2種類が存在 • 各種バージョンはお好みに より製品版らしくするconfigureオプション
  • 30.
    © 2019 NTTDATA Corporation 30 #jjug_ccc #ccc_a6b より製品版らしくするconfigureオプション OpenJDK Runtime Environment (build 14.0.0.1+2-TypeS) --with-version-feature --with-version-interim --with-version-update --with-version-patch --with-version-build --with-version-opt ※--with-version-preは空文字列(’’)をセット
  • 31.
    © 2019 NTTDATA Corporation 31 #jjug_ccc #ccc_a6b build/linux-x86_64-server-release/bundles/ ├── jdk-14.0.0.1+2_linux-x64_bin-symbols.tar.gz ├── jdk-14.0.0.1+2_linux-x64_bin-tests-demos.tar.gz └── jdk-14.0.0.1+2_linux-x64_bin.tar.gz 成果物のファイル名へも反映される $ tar tvfz jdk-14.0.0.1+2_linux-x64_bin.tar.gz -rwxrwxr-x ysuenaga/ysuenaga 18896 2019-11-12 10:23 jdk-14.0.0.1/bin/jaotc -rwxrwxr-x ysuenaga/ysuenaga 18792 2019-11-12 10:23 jdk-14.0.0.1/bin/jar -rwxrwxr-x ysuenaga/ysuenaga 18800 2019-11-12 10:23 jdk-14.0.0.1/bin/jarsigner -rwxrwxr-x ysuenaga/ysuenaga 18760 2019-11-12 10:23 jdk-14.0.0.1/bin/java
  • 32.
    © 2019 NTTDATA Corporation 32 #jjug_ccc #ccc_a6b より製品版らしくするconfigureオプション java.vm.vendor=NTT DATA java.vendor=NTT DATA java.vendor.url=https://oss.nttdata.com/ java.vendor.url.bug=https://oss.nttdata.com/bugreport/ --with-vendor-name --with-vendor-url --with-vendor-bug-url
  • 33.
    © 2019 NTTDATA Corporation 33 #jjug_ccc #ccc_a6b クラッシュレポート(hs_errログ)の例 # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00007ff33dea4b25 (sent by kill), pid=58807, tid=58807 # # JRE version: OpenJDK Runtime Environment (14.0.1+2) (build 14.0.0.1+2-TypeS) # Java VM: OpenJDK 64-Bit Server VM (14.0.0.1+2-TypeS, mixed mode, sharing, tiered, compressed oops, g1 gc, linux-amd64) # Problematic frame: # C [libpthread.so.0+0xab25] __GI___pthread_timedjoin_ex+0x215 # # Core dump will be written. Default location: Core dumps may be processed with "/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h" (or dumping to /home/ysuenaga/test/LongSleep/core.58807) # # If you would like to submit a bug report, please visit: # https://oss.nttdata.com/bugreport/jvm/ --with-vendor-vm-bug-url JDK-8233785
  • 34.
    © 2019 NTTDATA Corporation 34 #jjug_ccc #ccc_a6b もらったJDK使ってるけど、 なんか動かないんだよね… うわ、バグだ…
  • 35.
    © 2019 NTTDATA Corporation 35 #jjug_ccc #ccc_a6b デバッグ • 基本はメモリダンプでネイティブデバッガ • LinuxならGDB、WindowsならVisual StudioかWinDbg • デバッグ情報を実行バイナリと同じ場所へ展開 • Windowsではフルダンプを取得するよう設定するのがオススメ • Javaレイヤからも追っていく場合はjhsdbが便利 • 詳細はこちら
  • 36.
    © 2019 NTTDATA Corporation 36 #jjug_ccc #ccc_a6b OpenJDKコミュニティ • バグ登録はOpenJDKコミュニティで 権限をもっていないとできない • Authorと呼ばれるロール以上を保持する人のみ • GitHubはあくまでミラーリポジトリ • JDKについてはIssueやPRを受け付けない • メールで勝負!
  • 37.
    © 2019 NTTDATA Corporation 37 #jjug_ccc #ccc_a6b パッチ出し 1. バグ、改善内容を見つける 2. 既知のものでないか確認する • https://bugs.openjdk.java.net/ 3. コードを修正し、パッチを作る 4. パッチをメールにベタ書きしてMLへ投稿! $ hg diff
  • 38.
    © 2019 NTTDATA Corporation 38 #jjug_ccc #ccc_a6b うまくやるコツ:正しい出し先を選ぶ! http://mail.openjdk.java.net/mailman/listinfo
  • 39.
    © 2019 NTTDATA Corporation 39 #jjug_ccc #ccc_a6b パッチ等、JDKのテストをしたい場合 1. jtregをダウンロードし、展開する • https://ci.adoptopenjdk.net/view/Dependencies/job/jtreg/ 2. $JT_HOMEにjtregディレクトリを、 $JT_JAVAにテスト対象のJDKディレクトリを設定する 3. JDKをmake test-imageする • Google Testも有効化(--disable-hotspot-gtestを付けない) • デバッグビルドするのがオススメ 4. 目的のテストケースを実行する $ $JT_HOME/bin/jtreg -ignore:quiet -exclude:ProblemList.txt -nativepath:<ビルドディレクトリ>/support/test/<テスト対象>/jtreg/native/lib <テストケース>
  • 40.
    © 2019 NTTDATA Corporation 40 #jjug_ccc #ccc_a6b まとめ • 基本はconfigure→make • ソースはhg.openjdk.java.netから! • configureオプションでバージョン番号などもしっかり設定! • エラーが出たらconfigureの指示に従う • アーカイブまで作るときはmake product-bundles • 配布する場合は、配布先の実行環境に注意! • ビルド時の情報や生成物は大事に保管しておく • コミュニティへ報告をする場合は送信先MLに注意 • パッチを作るときはhg diff
  • 41.
    © 2019 NTTDATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。