あなたのプロジェクトが 気軽にJavaをバージョンアップするために必要なこと 第10回 #渋谷Java 2015-‐3-‐7(Sat)
View Slide
自己紹介 • 渡辺 • (株)ビズリーチ • @nabedge • h8p://mixer2.org • h8p://nabedge.blogspot.jp 2
質問 • Java8ですか? • Java7? • Java6? • Java5? • まさかの古代言語? 3
なぜ古いJavaを使い続けるのか? • バージョンを上げて何かあったら嫌だから – 何かあったときにもとの古いJDK/JREに戻すのが面倒くさい – テストをやりなおすコスト • 「全てのサーバのJDKのバージョン上げて」というとインフラ担当者が嫌な顔をするから。 – とにかく上司を説得するのが面倒くさいから。 4
• 「がんばってJava5,6,7 から Java8にバージョンアップだ!」 – N年後 • 「もうJava11が出てるのにまだJava8使ってるの?」 • 同じやり方でやれば行き着く先は同じ。 – 大切なのは「バージョンアップする」ことではなくて「バージョンアップしやすくする」こと。 5
JREとJDK • JDK=開発に必要なもの – ソースコードをコンパイルする – ローカル開発環境とJenkinsの中にあるもの • JRE=運用に必要なもの – コンパイル済みのバイナリを実行する – テスト環境/本番環境の中にあるもの 6
JREとJDK • 「とりあえず全サーバにJDKが入っている」 のは何故? – A: 大は小を兼ねるから。 – A: JDK/JREのインストールをインフラ担当者に任せてしまうから。 – 実はこのあたりから「バージョンアップできないJava」が始まる 7
JDKの切り替えなんて簡単 8 Eclipseの設定ダイアログ
JDKの切り替えなんて簡単 9 Jenkinsの管理画面
JREの切り替えはどうする? • JREを気軽にバージョンアップするためには? • なんかあったらすぐ元に戻すためには? 10
去年のJJUG 11 当時の資料 h8p://www.slideshare.net/nabedge/java-‐the-‐twelve-‐factor-‐app
h8p://12factor.net 12
突然CM入れてみたりとか 13 Javaな人、絶賛採用中 h8p://www.bizreach.co.jp/recruit/
第2章「依存関係」の最後の段落 Twelve-‐Factor Appは、いかなるシステムツールの暗黙的な存在にも依存しない。例として、アプリケーションからImageMagickやcurlを使う場合がある。これらのツールはほとんどのシステムに存在するだろうが、アプリケーションが将来に渡って実行され得るすべてのシステムに存在するかどうか、あるいは将来のシステムでこのアプリケーションと互換性のあるバージョンが見つかるかどうかについては何の保証もない。アプリケーションがシステムツールを必要とするならば、そのツールをアプリケーションに組み込むべきである。 14
• 「アプリケーションがシステムツールを必要とするならば、そのツールをアプリケーションに組み込むべきである」 • 「アプリケーションがJREを必要とするならば、JREをアプリケーションに組み込むべきである」 15
• 実際のところどうすべきか? – アプリにJREを組み込んでリリース物を作る – JREにアプリを組み込んでリリース物を作る 16
Java1.4からその機能はある 17 1.4, 5,6,7,8 全てほぼ同じことが書いてある
公式マニュアルにはっきり書かれている 1. $JAVA_HOME=/var/lib/jre1.x.x_nn だとして 2. $JAVA_HOME/lib/ext の配下は自分で作ったjarを置いてもいい場所ですよ 1. そこは自動的にクラスパスに含まれますよ 18
前提 • Tomcatはインストール型ではなく ライブラリ型=組み込みtomcat=を使え。 19
組み込みTomcatとは • Tomcat 7.0.1x (2011年初頭)くらいから安定リリース • tomcat-‐embed-‐core-‐7.0.x.jar • tomcat-‐embed-‐logging-‐log4j-‐7.0.x.jar 20
public stacc void main(String[] args) { Tomcat tomcat = new Tomcat(); tomcat.setPort(8080); tomcat.addWebapp("/”, new File(“/var/webAppDir) .getAbsolutePath()); tomcat.start(); tomcat.getServer().await(); } 21
ビルド方法 1. 自作のアプリをjarに固めておく 2. 使用するフレームワークやライブラリのjarも集めておく 例:mvn dependency:copy-‐dependencies 3. tar zxf jre-‐”N”uXX-‐linux-‐x64.tar.gz 4. cp [1,2のjar群] jreNuXX/lib/ext/ 5. jreNuXX/配下を再びzipかtarballに固める 22
リリース&実行方法 1. 前頁のビルド成果物をサーバ上で解凍する 2. export JAVA_HOME=解凍先ディレクトリ 3. $JAVA_HOME/bin/java com.example.YourMain ※ -‐classpath=… を指定する必要は無い。 23
JREのバージョンup/down方法 • ビルドするときにjreのtarballのバージョンを変えるだけ。 – これならインフラさんに迷惑かける必要ないよね。 24
まとめ • JDKとJREはちゃんと区別して考える。 • 全ての普通のjarに固める。 • APサーバは組み込みで。 – tomcat-‐embed, je8y… • JREもろともリリースせよ。 – ライブラリのjarの差し替えと同じ間隔でJREも差し替えられるように。 – 実は古来から存在する普通の技です。 25
ありがとうございました! 26