Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

594 views

Published on

オレ流のOpenJDKの開発環境
(JJUG CCC 2019 Fall講演資料、2019年11月23日)

NTTデータ 技術開発本部 先進基盤技術グループ
末永 恭正 / Yasumasa Suenaga

Published in: Technology
  • Be the first to comment

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

  1. 1. © 2019 NTT DATA Corporation 1 © 2019 NTT DATA Corporation OpenJDKの開発環境 2019年11月23日 株式会社NTTデータ 末永 恭正 #jjug_ccc #ccc_a6b
  2. 2. © 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
  3. 3. © 2019 NTT DATA Corporation 3 #jjug_ccc #ccc_a6b Java使いたいんだって? もちろん(Javaも)ちゃんと面倒見てくれるんだよね? Javaで書くのは全然構わないっすけど 何使えばいいっすかね
  4. 4. © 2019 NTT DATA Corporation 4 #jjug_ccc #ccc_a6b
  5. 5. © 2019 NTT DATA Corporation 5 #jjug_ccc #ccc_a6b もう自分で作っちゃおうかな…
  6. 6. © 2019 NTT DATA Corporation 6 #jjug_ccc #ccc_a6b オレ流 … 誰流? • 末永 恭正 @YaSuenag • NTTデータでJavaやってるサンデープログラマー • OpenJDK Reviewer • IcedTea Committer • Linux x64とWindows x64向けJDKをビルドした経験あり 今回のお話の前提条件にします! ※JDKは13以降を対象にします
  7. 7. © 2019 NTT DATA Corporation 7 #jjug_ccc #ccc_a6b そんなにクセのないOpenJDKビルド ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make 一般的なOSSのビルドとあまり変わらない!
  8. 8. © 2019 NTT DATA Corporation 8 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  9. 9. © 2019 NTT DATA Corporation 9 #jjug_ccc #ccc_a6b ソースコードの入手 • 基本は公式リポジトリからのclone • SCMはMercurial • ブラウザからダウンロードも可能 $ hg clone http://hg.openjdk.java.net/jdk/jdk/
  10. 10. © 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」の形で バージョン別アップデートが存在
  11. 11. © 2019 NTT DATA Corporation 11 #jjug_ccc #ccc_a6b 詳細バージョン指定 tagsから指定可能
  12. 12. © 2019 NTT DATA Corporation 12 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  13. 13. © 2019 NTT DATA Corporation 13 #jjug_ccc #ccc_a6b 環境 Windows 10 Professional WSL Hyper-V Windows版ビルド環境Linux版ビルド環境 オレ流
  14. 14. © 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版ビルド環境
  15. 15. © 2019 NTT DATA Corporation 15 #jjug_ccc #ccc_a6b ビルドに関する情報 <JDKソース>/docs/building.{md,html}
  16. 16. © 2019 NTT DATA Corporation 16 #jjug_ccc #ccc_a6b 公式ビルド環境 https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms
  17. 17. © 2019 NTT DATA Corporation 17 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  18. 18. © 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 オレ流
  19. 19. © 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関連) ※プラットフォームにより異なります デバッグ版 デバッグ版 リリース版 デバッグ版 リリース版 リリース版
  20. 20. © 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'. 対処方法
  21. 21. © 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
  22. 22. © 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配下のどこか)に展開しておく必要がある
  23. 23. © 2019 NTT DATA Corporation 23 #jjug_ccc #ccc_a6b ① ソースのダウンロード ② 必要なソフト類の準備 ③ configure ④ make
  24. 24. © 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
  25. 25. © 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本体 ① ② ③
  26. 26. © 2019 NTT DATA Corporation 26 #jjug_ccc #ccc_a6b 注意すべきこと • 配布先(実行環境)によっては動かないことがある • 例1:Fedora 31でビルドしたものはCentOS 6で動かない • 例2:CentOS 6でビルドしたものはAlpineで動かない • デバッグ情報は大事に保管しておく • ソースコードも大事に取っておく • configureオプションもきちんと取っておく • build/<configure設定>/configure.log
  27. 27. © 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)
  28. 28. © 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
  29. 29. © 2019 NTT DATA Corporation 29 #jjug_ccc #ccc_a6b • ベンダ名を正しく設定 • 各種URLも正しく設定 • ベンダURLとバグ報告URLの違いに注意 • バグ報告URLは全体とVMの2種類が存在 • 各種バージョンはお好みに より製品版らしくするconfigureオプション
  30. 30. © 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は空文字列(’’)をセット
  31. 31. © 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
  32. 32. © 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
  33. 33. © 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
  34. 34. © 2019 NTT DATA Corporation 34 #jjug_ccc #ccc_a6b もらったJDK使ってるけど、 なんか動かないんだよね… うわ、バグだ…
  35. 35. © 2019 NTT DATA Corporation 35 #jjug_ccc #ccc_a6b デバッグ • 基本はメモリダンプでネイティブデバッガ • LinuxならGDB、WindowsならVisual StudioかWinDbg • デバッグ情報を実行バイナリと同じ場所へ展開 • Windowsではフルダンプを取得するよう設定するのがオススメ • Javaレイヤからも追っていく場合はjhsdbが便利 • 詳細はこちら
  36. 36. © 2019 NTT DATA Corporation 36 #jjug_ccc #ccc_a6b OpenJDKコミュニティ • バグ登録はOpenJDKコミュニティで 権限をもっていないとできない • Authorと呼ばれるロール以上を保持する人のみ • GitHubはあくまでミラーリポジトリ • JDKについてはIssueやPRを受け付けない • メールで勝負!
  37. 37. © 2019 NTT DATA Corporation 37 #jjug_ccc #ccc_a6b パッチ出し 1. バグ、改善内容を見つける 2. 既知のものでないか確認する • https://bugs.openjdk.java.net/ 3. コードを修正し、パッチを作る 4. パッチをメールにベタ書きしてMLへ投稿! $ hg diff
  38. 38. © 2019 NTT DATA Corporation 38 #jjug_ccc #ccc_a6b うまくやるコツ:正しい出し先を選ぶ! http://mail.openjdk.java.net/mailman/listinfo
  39. 39. © 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 <テストケース>
  40. 40. © 2019 NTT DATA Corporation 40 #jjug_ccc #ccc_a6b まとめ • 基本はconfigure→make • ソースはhg.openjdk.java.netから! • configureオプションでバージョン番号などもしっかり設定! • エラーが出たらconfigureの指示に従う • アーカイブまで作るときはmake product-bundles • 配布する場合は、配布先の実行環境に注意! • ビルド時の情報や生成物は大事に保管しておく • コミュニティへ報告をする場合は送信先MLに注意 • パッチを作るときはhg diff
  41. 41. © 2019 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

×