Archive for 7月, 2014

javac コマンドの-source, -target オプションのルール変更について


Java SE 5 以前の Java のソース・コードを Java SE 7, Java SE 8 の環境でご利用頂いている皆様に、今後の JDK における仕様変更(予定)のご案内をさしあげます。

※ この情報は 2013 年 4 月 14 日に開発者 (Joseph D. Darcy) からアナウンスされた情報です(ご参照:Changing Sources and Moving Targets: Evolving the javac command line )。また、JEP(JDK Enhancement Proposal) 182 としてリストされている内容です。

今まで、javac のコンパイラ・オプションで “-source”, “-target” オプションを使用し、過去のバージョンで作成した Java のコードを現在の target で指定した Java の実行環境上で動作させる事ができました。

例えば、下記の簡単な AWT で実装したコードをご覧ください。ここでは、Frame の親クラスである Window クラスの Windows#show() メソッドが Java SE 5 で deprecated になっています。

import java.awt.Frame;

public class Test{
    public static void main(String argv[]){
        Frame frame = new Frame();
        frame.setSize(300 , 150);
        frame.show();
    }
}

上記のコードを、JDK 5 以降のバージョンでコンパイルすると下記のワーニングが出力されます。

ここでは、JDK 7 でコンパイルした例を示します。

> javac Test.java
注意:Test.javaは非推奨のAPIを使用またはオーバーライドしています。
注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください

> javac -Xlint:deprecation Test.java
Test.java:8: 警告: [deprecation] Windowのshow()は非推奨になりました
frame.show();
^
警告1個

この J2SE 1.4 で実装されたコードを Java SE 7 の環境で動作させるためには、コンパイル・オプションに下記の “source”, “target” を指定する(bootclasspathは 1.4.2 の rt.jar を指定)事で Java SE 7 の環境で実行させる事ができました。

> javac -bootclasspath /tmp/rt.jar -source 1.4 -target 1.7 Test.java

今回、JEP 182 で提案された内容は、上記の ”source”, “target” で指定できるバージョンについてのルール変更です。

まず、Java SE 8 で Java SE 5 以前のバージョンが指定された場合に、「deprecated (非推奨) 」であるワーニングメッセージを出力するように変更されています。実際に、Java SE 8 の環境で ”source” に 1.4 を指定した場合の例を下記に示します。下記のように、Java SE 8 からワーニング・メッセージが出力されるようになっています。

> javac -bootclasspath /tmp/rt.jar -source 1.4 -target 1.8 Test.java
警告: [options] ソース値1.4は廃止されていて、今後のリリースで削除される予定です

警告: [options] 廃止されたオプションについての警告を表示しないようにするには、-Xlint:オプションを使用します。
警告2個

そして、Java SE 9 では Java SE 5 以降 以前のオプションを完全に削除するという内容になっております、もっと正確に申し上げるならば、今後の Java のリリースにおいて1プラス3バックのルールが採用されるようになります。

● Java SE 9 リリース時に指定可能な値: 9/1.9, 8/1.8, 7/1.7, 6/1.6
● Java SE 10 リリース時に指定可能な値: 10/1.10 9/1.9, 8/1.8, 7/1.7

この変更を行う理由ですが、Java の 1.0 のリリース以降、クラス・フォーマットは非常に多くのバージョン・アップを重ねており、Java コンパイラのメンテナンス・コストが非常に高まっています。このメンテナンス・コストを軽減するための措置として変更が考えられています。どうぞご理解の程宜しくお願いします。

日本においても、上記の仕様変更によって影響のある環境も少なからずあるかと想定します。現時点でも、Java SE 5 以前のコードを Java SE 8 以降の環境で動作させる事は非推奨となっております。また、Java SE 9 では上記を実現する事もできなくなります。仮に Java SE 5 以前のコードが存在する場合には、お早めに、deprecated なクラスやメソッドを取り除き、Java SE 7, 8 等の最新の環境で正常に動作するように移行をご検討いただければ誠に幸いです。

2014年7月2日 at 12:55 PM 1件のコメント


Java Champion & Evangelist

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2014年7月
« 6月   9月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

カテゴリー

Twitter

  • DEISは分かりやすく言うと、HerokuがAzureにやってきた!!という感じかな。 17 hours ago
  • まだ、完全ではありませんが、最初の大事な部分はまとめたので、オリジナルメモよりもやりやすくなるかと思います。 ちなみに、オリジナルの検証メモはこちら。 github.com/yoshioterada/P… 17 hours ago
  • de:code 発表用に DEIS on Kubernetes on Azure Container Service について色々と検証した内容を誰でも触れるように、この土日でハンズオン資料としてまとめました。 github.com/yoshioterada/D… 17 hours ago
  • @opendeis Now, I’m creating following documents. github.com/yoshioterada/D… 1 day ago
  • RT @msdevjp: ジャパン・インターカルチュラル・コンサルティング社 社長 Rochelle Kopp 氏と米マイクロソフト DevOps エバンジェリスト 牛尾 は、DevOpsなどが日本に導入できない理由を、これらが西洋の問題を解決するためのものだからだと指摘。 #… 2 days ago

clustermap

ブログ統計情報

  • 955,338 hits

Feeds