新春特別企画

2019年のJava

この記事を読むのに必要な時間:およそ 4 分

アップグレード戦略も次のの2つの方法があります。

  1. ソースコード未修正でアップデート
  2. 新しい言語仕様に沿ったソースコードの修正

1:ソースコード未修正でアップデート

1つ目の方法は,既存のソースコードには修正を加えず,Javaの実行環境だけをアップデートする方法です。この方法は今までもありましたが,ソースコードをコンパイルする際に,-source,-target,-bootclasspath オプションを指定してコンパイルします。これにより,-sourceで指定ソースコードを-targetで指定した環境下で動かすことができました。

Java SE 9からはこれらのオプションをまとめた新しい--releaseオプションが追加されています。これを利用することで,指定した環境用のクラスコードを出力してくれます。たとえば,下記の例のようにOpenJDK 11の環境で,Java SE 7のコードを「javac --release 7 Test.java」としてコンパイルが可能です。

この場合Java SE 7用のクラスファイルが生成され,さらにJava VM 11の環境でコードを動かすことができます。ソースコード未修正で環境をアップデートしたい場合は,今後--releaseオプションをご使用ください。

Java SE 7のソースコード例(Test.java)

public class Test{
    public static void main(String... args){
        int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int number : numbers) {
            System.out.println("number = " + number);
        }
    }
}

OpenJDK 11がインストールされている環境で下記を実行します。

$ javac --release 7 Test.java 
$ java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
$ java Test
number = 1
number = 2
number = 3
number = 4
number = 5
number = 6
number = 7
number = 8
number = 9
number = 10
 

新しい言語仕様に沿ったソースコードの修正

新しい言語仕様に沿ったソースコードを修正するためには,上述したように,アーリーアクセス版による検証や,JEPのチェックなどが必要なのはもとより,柔軟なバージョンアップを行うためのビルドテスト環境の充実が必要になります。

JUnitや Seleniumなどによるテストコードの整備,さらにはソースコードのコミット時に自動ビルドや自動テストを行い,素早く変更に対する検証ができるような整備が必要になるでしょう。また素早く検証するために,必要に応じてコンテナ化なども見据えた対応も必要になってくるかと思います。

通常は,LTS版を利用しインシデントが発生した時点で対応を検討

また,従来型のシステム開発や運用,さらにはミッションクリティカル領域での運用においては開発期間も長く,頻繁なJavaのバージョンアップが難しい場合もあるでしょう。その場合はLTS版をご利用いただくことで不測の事態に対応することも可能になります。

通常は,LTS版を利用し開発・運用を行い,Java VMに対する不具合などが発生した場合ベンダ(Oracle,Red Hat,Azul Systemsなど)からのサポートを受ける選択肢を残しておくことで,より長くJavaアプリケーションを安心して本番環境で利用することができるようになります。サポート期間は各ベンダによって異なりますので,どの環境でJavaを動作させるのか,もしくはどのベンダのサポートを受けるのか選択肢の幅は広がっています。

サービスに影響のない範囲で自己責任において長期利用

また,システムを塩漬けにしたいニーズもあるかと思います。外部に公開されているシステムならば,塩漬けをお勧めしませんが,仮に社内ネットワークなど閉じた環境で,かつ信頼されるネットワーク環境下で運用される場合,古いJavaのバージョンのまま運用していただくことも可能かと想定します。この場合は,自己責任の範囲内で長期利用をご検討ください。

Oracle JDKとOpenJDKの違いについて

ここまで,サポートやバージョンアップ,システムへの適用についてまとめてきましたが,最後にOracle JDKとOpenJDKの違いについても触れます。

まず過去の経緯について紹介します。Java SEが初めてオープンソース化されたころ(OpenJDK 6)は,大きな差がありました。しかし,Java SE 8の開発では,Oracle JDKもOpenJDKをベースに開発がされるようになりましたので,以前に比べ差はほとんどありません。

そして,OpenJDKバイナリ の入手方法に関しても,本家 OpenJDKのサイトの他,Azul Systems社が提供するZulu,Javaコミュニティが主導するAdoptOpenJDKなどから入手可能です。その他,Eclipse OpenJ9など,さまざまな選択肢があります。またサポートに関しても Oracle 社によるOracle JDKはもちろん,他社からも各OpenJDKビルドに応じてサポートを受けることができるようになっています。

今では,Javaを無償で使う選択肢も,商用サポートを購入して利用する選択肢も以前より増えています。今後はユーザ自身がさまざまな情報を収集し,どのJava製品が自分の環境に最適かを考えて選択しなくてはならないでしょう。

著者プロフィール

寺田佳央(てらだよしお)

Microsoft Corporation

シニア・クラウド・デベロッパー・アドボケイト

 

2001年サン・マイクロシステムズ株式会社に入社し,GlassFishエバンジェリストとして活動。

2010年,OracleのSun買収後,日本オラクル株式会社でJavaエバンジェリストとして活動。Javaの最新技術情報の提供や,Java コミュニティ活動の活性化を,日本Javaユーザ・グループ(JJUG)とともに行ってきた。

2015年7月,日本マイクロソフト株式会社に移籍し,移籍後もなお,Javaエバンジェリストとして,MicrosoftプラットフォームにおけるJavaの利用促進・啓蒙活動を実施中。

2018年7月より,Microsoft Corporationで日本人初のクラウド・デベロッパー・アドボケイトとして活動を開始。

2016年7月,日本人で2人目となるJava Championに就任。JJUG幹事の一員でもある。

Blog:https://yoshio3.com

GitHub:yoshioterada

Facebook:yoshio.terada

Twitter:@yoshioterada