あなたのプロジェクトが	
  
気軽にJavaをバージョンアップする
ために必要なこと	
第10回	
  #渋谷Java	
  
2015-­‐3-­‐7(Sat)	
  
自己紹介	
•  渡辺	
  
•  (株)ビズリーチ	
  
•  @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

渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと