Java

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動
Java
パラダイム オブジェクト指向プログラミング関数型言語命令型プログラミングジェネリックプログラミング ウィキデータを編集
登場時期 1995年(25年前) (1995
設計者 Java Community Process
開発者 サン・マイクロシステムズオラクル ウィキデータを編集
最新リリース Java Standard Edition 13.0.2/ 2020年1月14日(44日前) (2020-01-14
型付け 強い静的型付け
主な処理系 Javaプラットフォーム
影響を受けた言語 Simula 67、SmalltalkObjective-CObject PascalOberon-2EiffelModula-3MesaC SharpUCSD Pascal ウィキデータを編集
影響を与えた言語 C#, D, Dart, Groovy, Scala, Kotlin, Ceylon
プラットフォーム Solaris, Linux, Windows,
macOS, AIX, System i,
Embedded Systems
ライセンス GNU General Public LicenseJava Community Process
ウェブサイト www.java.com ウィキデータを編集
拡張子 java、class、jar
テンプレートを表示

Java(ジャバ)は、プログラミング言語Javaと、Javaプログラムの実行環境と開発環境を合わせた演算プラットフォームの双方を指す総称である[1]

Javaソフトウェアは、企業内システムの構築のほか、ブルーレイディスクレコーダーを始めとする家電機器と乗用車搭載の組み込みシステムマイクロ制御装置モバイル端末スマートカード、パーソナルコンピュータ、サーバーマシン、スマートフォンなどの様々な環境に普及しており、幅広い用途で使用されている。

Java言語は、近年のグローバルな機械学習の需要増加により世界シェアでPythonには抜かれたが、システム開発では依然信頼されている言語であり、世界シェア2位の座を保っている[2]

Javaの特徴[編集]

Oracleによる主張[編集]

Java開発元のSun Microsystemsを買収し、Java開発を引き継いだOracleによる公式な主張は下記である[3]。企業内システムの開発に最適であるとしている。

Java reduces costs, shortens developer timeframes, drives innovation, and improves application services as the programming language of choice for enterprise architecture, finance, and HR. Java is used in many industries including manufacturing, automotive, insurance, and public sector. Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造、自動車、保険、公共部門などの多くの業界で使用されています。

また、全世界では、3億のデバイスで動作し、1200万人が開発で使用し、250億のJava Card(Javaアプリケーションが動作するスマートカード)が購入されていると発表している[3]

Javaの構文[編集]

Javaプログラムの構文は、C言語またはC++によく似たものである。オブジェクト指向言語としての一面が強調されがちだが、幾つかの構文ルールの違いを除いては、C言語とほぼ同様にシンプルな手続き型プログラミングのスタイルでもプログラミングできる。Javaはオブジェクト指向のプログラミングスタイルをそれほど強制しない。

オブジェクト指向[編集]

Javaの主要プログラミングパラダイムは、クラスベースオブジェクト指向である[4]。オブジェクト指向にある複数の実装スタイルの一つであるクラスベースは、手続き型プログラミングを土台にして実践できる比較的万人向けのものである。クラスベース・オブジェクト指向はその名の通りクラスの仕組みを中心にする。クラスは任意のフィールド(=変数)と任意のメソッド(=関数)をひとまとめにしたものである。クラスのデザインはフィールド構成を中心にして、それに関連したメソッドを備えるのが基本とされる。クラス定義内の要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスはクラス内で定義される入れ子のクラスであり、コンポジションパターンの実装が主な用途になる。メソッド内部で任意のクラスを派生元にした無名クラスを定義する事もできる。これはプロトタイプベース・オブジェクト指向のスタイルを取り入れたもので、その場限りのクラスをコードに組み込める利便性の高い機能である。クラスの定義文には上述のフィールド名やメソッド文などの要素がずらずらと羅列される。Javaのプログラムは、この1個以上のクラス定義文を組み合わせて形成される。Javaはクラスベース・オブジェクト指向の三つの要点とされるカプセル化継承多態性をサポートしている。

Javaのカプセル化は、クラス定義文に記述する四つのアクセス修飾子(privatepackageprotectedpublic)によってサポートされている。アクセス修飾子はフィールド定義とメソッド定義のそれぞれ先頭に記されて可視性を決定する。privateは同クラス内限定、packageは同クラス内と同パッケージ内限定、protectedは同クラス内と同パッケージ内と派生クラス内限定、publicはどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はOOPでは変則的なファイル単位のpackageなので隠蔽性よりも利便性が重視されている。

Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており、多重継承は除外されている。継承用のアクセス修飾子は無くpublic継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。また既存とオリジナルの全てのクラスは、基礎APIで用意されているObjectクラスを継承最上位の基底クラスにするのが強制されている。Objectクラスにはロック機能が備えられているのでオブジェクト指向とマルチスレッド同期の連携に一役買っている。

Javaの多態性は、インターフェースと仮想関数を中心にしてサポートされている。親クラスの定義文でvirtual指定されたメソドが仮想関数を表す抽象メソッドになり、その子クラスの定義文で処理内容を記述された同名のメソッドが仮想関数のプロセスを表す実装メソッドになる。Javaは強い静的型付けと共に安全な動的型付けも採用しており、instanceof演算子による型審査と、(typename)によるダウンキャストの二つがそれにあたる。ダウンキャスト失敗時は例外発生によってフォローされる。両者とも実行時決定でありデータの遅延バインディングをサポートしている。Javaの中でも比較的重視されているインターフェースは抽象メソッドだけで構成される純粋抽象クラスであり、クラス定義文のimplementsによって任意の数だけ実装指定できる。インターフェースは各クラスの様々な動作局面表現を促して設計を明確にする。Javaにはリフレクションも導入されている。これはクラスの構造内容を操作できる機能であり、Javaの理念である堅牢性とセキュリティを壊しかねない危うさを伴うが、分散コンピューティングの発展などを視野に入れたJavaテクノロジの拡張に不可欠とされて専用APIが用意された。リフレクションはメッセージベース・オブジェクト指向のスタイルに近い柔軟な多態性の動的ディスパッチを実装できる他、Javaプログラムの為のメタ的なモニタリングツールおよびフレームワークの構築などが主な用途になる。

プラットフォーム非依存[編集]

プラットフォーム非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”Write once, run anywhere”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。

  1. Javaコンパイラは、Javaプログラムのソースコードを、Javaバイトコードと呼ばれる中間表現にコンパイルする。Javaバイトコードはアセンブラのニーモニックに似たもので、Java仮想マシン上で実行される専用のコードになる。Javaバイトコードは多くのプラットフォームでは、Javaクラスファイルと呼ばれるclass拡張子のファイルにまとめられる。
  2. Java仮想マシンは、Javaプログラムと各プラットフォームの間でそれぞれの環境の違いを吸収するクッション的なソフトウェアである。Java仮想マシンは家電や車両搭載のマイクロコントローラ、モバイル端末、ICカード、サーバーマシンなどの様々なコンピューター環境に対応したバージョンが提供されており、それぞれのプラットフォームにJava実行環境のコアテクノロジとしてインストールされる。
  3. Java仮想マシンは、指定されたJavaクラスファイルを読み込み、その中のJavaバイトコードを逐一解釈しながら実行する。これはインタプリタ式に行うものと、実行時コンパイラで走行させるものがある。

公開初期のインタプリタ式のみで走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ方式の導入によって速度問題に一定の解決が見られた。実行時コンパイラとは一定範囲のJavaバイトコードをまとめて機械語コードにコンパイルして継続的に実行させる技術である。後にそのコンパイル処理を更に最適化した動的再コンパイル(dynamic recompilation)という拡張技術も導入され、Javaプログラムの実行速度問題はほぼ解決されたと見なされている。

マルチスレッド[編集]

Javaプログラムは複数のスレッドを同時に走らせる事ができる。多数のスレッドを扱う大規模システムにも対応しており、その一つであるスレッドグループは、各スレッドを役割や性質でグループ化して様々な一括操作を可能にしている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。

マルチスレッドを扱う際の要点であるスレッド同期(synchronization)の特徴としては、全てのインスタンスにロックオブジェクト機能を持たせている事が挙げられる。このロックはsynchronizedキーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。synchronized修飾子を付加された各メソッドはその全体が排他制御エリアとなり、呼び出し時はデフォルト的にthisインスタンスからロックを取得するので、イメージ的にインスタンス単位となる排他制御が容易に実装できた。このロック普遍化はオブジェクト指向との協調を明確に表現した設計と言える。synchronizedクラスメソッドの方は、システム内に暗黙的に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同型インスタンス共通の同期と排他制御を表現できた。また、synchronized()定義子の波括弧で任意のコード部分を括る事により、メソッド内に部分的な排他制御エリアを設ける事が出来る。ここではthis以外のインスタンスもロックオブジェクトに指定出来るので多様な同期が可能となった。このミューテックス相当の標準同期は様々なロック手法にも応用可能であるが、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。

ガベージコレクション[編集]

Javaプログラムのメモリ管理は、Java仮想マシンに備えられたガベージコレクション機能によって行われる。ガベージコレクションとは、すでにどこからも参照されていないオブジェクトを自動的に特定して破棄し、その占有メモリを解放する機能である。一つのシステムスレッドに乗って未参照のオブジェクトを探し続ける実行プロセスはガベージコレクタと呼ばれる。ガベージコレクタは、どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する事もできる。これによってプログラマの負担は大幅に軽減される事になった。Javaのモデル言語であるC++では、オブジェクトの生成によるメモリ確保と同オブジェクトの破棄によるメモリ開放が正確に対応するように注意深くプログラムする必要があった。破棄の失敗は即メモリリークにつながり、その積み重ねはやがてメモリ不足を引き起こす事になる。メモリ管理はプログラマにとって負担が大きくバグ発生の温床になっていた。堅牢性を旨とするJavaではこの問題の根本的解決の為にガベージコレクションの機能に力が入れられ、世代別ガベージコレクションという拡張技術も導入された。

なお、ガベージコレクションの機能はメモリリークの問題を完全に解消する訳ではなく、例えばもう必要ないはずのオブジェクトを現行タスクが常時参照するコレクションオブジェクトに格納しているような場合は、ガベージコレクタはこれを特定しない。それでもガベージコレクション機能はプログラマが独自にメモリ管理をするよりも高速であり、まず間違いはなく、はるかに安全である。ガベージコレクタの挙動をプログラマ側はほとんど把握できないが特に影響はない。確実ではないが、ガベージコレクタの実行タイミングを指定する事はできる。

分散コンピューティング[編集]

この対象はオブジェクト要求ブローカーを用いた分散システムdistributed system)の実現であり、ネットワーク上に存在する様々なプラットフォームの間で互いに異なる環境を意識せずにリクエストとレスポンスを送りあい、任意のタスクを遂行するインフラストラクチャの構築をサポートする。各プラットフォーム上で稼働されるサーバープログラム、クライアントプログラム、あるいはその双方を兼ねるプログラムは、それぞれオブジェクトを内包しており、オブジェクト要求ブローカーを通して他のオブジェクトにリクエストを送る。それらは分散オブジェクトと呼ばれている。Javaで扱われるオブジェクト要求ブローカーの実装は、JavaオリジナルのRMIと、CORBAの二つである。業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるように様々な設計が施されている。

分散コンピューティングからは外れるが、JavaのネットワークAPIは、TCP/IPUDPプロトコル上のソケット通信、セキュアなSSLソケット通信を扱っており、XMLパーサと、XML構造を操作できるDOMSAXも備えられている。これらはカスタムメイドなネットワークシステムの構築をサポートする。

セキュリティ[編集]

Javaはセキュリティを考慮して設計されており、サンドボックスモデルに基づいたセキュリティ機構を備えている。セキュリティ機構を正しく実装したJava実行環境を適切に使うことで、遠隔のコンピュータ上にある実行コードを安全に実行できる(Javaアプレット)。初期のバージョンからコードの実行前に様々なセキュリティチェックを行えるメカニズムが実装されていた。

  • Java仮想マシンバイトコード検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
  • Java実行環境のクラスローダ機能により、クラス(バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
  • Java実行環境のセキュリティマネージャ機能(サンドボックス)により、Javaアプレットが、ユーザによって許可された資源以外の資源に不正にアクセスすることを防ぐ。
  • Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。

また、セキュリティを裏付ける堅牢性をコーディングレベルから促進するためにJavaは例外処理の構文を備えている。これは制御フローの一種であり、例外ブロック内の実行中に状態異常が発生すると例外オブジェクトが生成されて、その宛先となる例外捕捉ブロックに強制ジャンプするという仕組みを指す。これは「例外を投げる」と形容されている。例外捕捉ブロックでは、渡された例外オブジェクトに従った任意の例外解決処理を行い、例外ブロックを抜ける事になる。

Javaの歴史[編集]

草創[編集]

Javaのマスコット「Duke」with BSDライセンス

1990年頃、サンのエンジニア、パトリック・ノートンは、自社のプログラミング言語C++とCのアプリケーションプログラミングインタフェース(API)と開発ツールに不満を募らせていた。その頃、NeXTが注目を浴びていたことがきっかけとなって、ノートンはサンでプログラミング環境の開発の仕事をすることになった。NeXTワークステーションと、その環境であるNEXTSTEPでは、主力の言語としてObjective-Cが開発されていた。こうした経緯のなかで、次世代の家電製品のための新しいプログラミング言語を設計し、その処理系を開発することを目的とした「ステルスプロジェクト」と呼ばれるプロジェクトが始まった。

ステルスプロジェクトには、始まってすぐにジェームズ・ゴスリンとマイク・シェルダンが参加し、プロジェクトの名称は「グリーンプロジェクト」に変更された。プロジェクトには他のエンジニアたちも参加し、彼らはアメリカ合衆国カリフォルニア州メンローパーク市サンドヒルロードの道沿いにある小さなオフィスで作業を始めた。サンはこの分野が重要な市場になると予測していた。

プロジェクトチームでは当初はC++を検討していたが、いくつかの理由から却下された。理由は、当時の彼らの目的が、家電製品すなわち組み込みシステムだったからである。組み込みシステムでは、利用できるコンピュータ資源が少ないという制約がある。彼らはC++ではコンピュータ資源を食いすぎると判断した。またC++は複雑なプログラミング言語であり、C++を使うプログラマは注意していても間違いを犯しがちである。

C++にはガベージコレクションの機能が無い。ガベージコレクションが無いということは、プログラマが自分でオブジェクトの寿命(生存期間)を管理しなければならないことを意味する。プログラマが自分でオブジェクトの寿命を管理することは、冒険的で間違いやすい作業である。

プロジェクトチームは、いくつかの重要な機能についてC++の移植性が乏しいことも問題であると考えた。 このプロジェクトでの重要な機能とは、セキュリティおよび分散コンピューティングマルチスレッドであり、これらの機能が、プラットフォームに依存せずに使える必要があった。このような事情で、彼らはあらゆる機器に容易に移植できるプラットフォームが必要であると認識するようになった。

一方で、サンの別のエンジニア、ビル・ジョイは、ゼロックスパロアルト研究所Altoというワークステーション試作機のために開発されたプログラミング言語・MesaとCの良いとこどりをした新しいプログラミング言語を構想していた。ジョイは Further という名前で呼ばれる論文を書き、自社でC++に基づいたオブジェクト指向環境を開発するべきであることを進言した。まずジェームズ・ゴスリンがC++を改変し拡張することを試みた。ゴスリンはこの拡張版C++を、"C++ ++ --"と名付けた。しかしゴスリンは、すぐにこの拡張版C++の開発を中止して、全く新しいプログラミング言語を開発する方針を採ることにした。ゴスリンはこの新しい言語にOakという名前をつけた。この名前の由来は、ゴスリンのオフィスのすぐそばにオークの木が立っていたことによる。

バージョン履歴[編集]

1996年の第一回公開のJavaプラットフォームは「Java Development Kit」通称「JDK」と呼ばれており、最初のバージョン数値は「1.0」に定められた。通称とバージョン値を合わせたものが製品名とされて「JDK 1.0」で市場導入されている。当初は開発チームの控えめにしたい意向で小数点第一位がメジャーバージョン値にされたが、これは不必要な謙遜という声もあった。

1998年の第三回メジャーバージョン公開である「1.2」では大幅な技術刷新をアピールするべく「Java 2」と次世代呼称にした。これは経営側の判断だったので開発側は小数点第一位の数値改訂を譲らなかった。製品仕様の確立で「Development Kit」は「Platform」に置き換えられた。マーケットの分化を示唆する「Standard」のエディション名も付けられた。こうして「Java 2 Platform, Standard Edition」の通称「J2SE」とバージョン値「1.2」を合わせた製品名「J2SE 1.2」で市場導入された。この次世代呼称と小数点第一位の混在名は意味が不明瞭で製品バージョンへの理解を妨げかねないと不評を買っている。この時はまだStandard版だけであったが、翌1999年にEnterprise版の「J2EE 1.2」とMicro版の「J2ME 1.2」が市場導入されて3エデイションになった。

2005年の第六回メジャーバージョン公開である「1.5」から整数部分がメジャーバージョン値にされて「5.0」になり、通称と合わせた製品名は「J2SE 5.0」になった。他のエディションは後発なので「J2EE 1.4」「J2ME 1.4」のままだった。この頃に「Java Card Platform」が正規のエディション認定されているが、バージョン体系は独自のままの「Java Card 2.2」であり、これは以降も継続された。

2006年の第七回メジャーバージョン公開で「Java 2」の次世代呼称が外されて「Java」になり、バージョン値からも小数点以下が外された。「Java Platform, Standard Edition」「Java Platform, Enterprise Edition」「Java Platform, Mirco Edition」の各通称と各バージョン値を合わせた製品名は「Java SE 6」「Java EE 5」「Java ME 5」になった。なお、マイナーバージョンアップの際には再び小数点以下が付けられた。この命名方式は現在まで続いている。

JDK 1.0 (1996年1月23日)[編集]

最初のバージョン[5]。まだ国際化対応はされず英語版のみだった。

JDK 1.1 (1997年2月19日)[編集]

J2SE 1.2 (1998年12月8日)「Playground」[編集]

ここからコードネームが付けられるようになった[8]

  • 仮想マシンに実行時コンパイラ(Just-In-Time Compiler)が導入された
  • WEBブラウザにアプレットの実行環境をインストールするJavaプラグインが搭載された
  • 言語仕様に、厳密な浮動小数点数計算を行う範囲を指定するstrictfpキーワードが追加された
  • Java IDL(Javaインタフェース記述言語) - CORBAとの連携
  • Swing - ビューフレームとユーザーインターフェースAPI
  • コレクションAPI(コレクションフレームワーク)の強化

J2SE 1.3 (2000年5月8日)「Kestrel」[編集]

ここからメジャーバージョンのコードネームは動物名、マイナーバージョンは昆虫名にするのが慣例になった[9][10]

J2SE 1.4 (2002年2月6日)「Merlin」[編集]

このバージョンからJavaコミュニティプロセス(Java Community Process)による仕様策定が開始された[11][12][13]

  • 言語仕様にassert キーワードが追加された
  • 例外処理にチェーン状のレコードが備えらえた
  • Java Web Startが搭載された
  • 正規表現 API
  • New I/O API - バッファストリームを扱う
  • ロギング API - データログ
  • イメージ I/O API - JPEGPNGフォーマットを扱える
  • JAXP (Java API for XML Processing) - XMLパーサとXSLTパーサ
  • JCE (Java Cryptography Extension) - Java暗号化拡張機能
  • JSSE (Java Secure Socket Extension) - Javaでセキュアなインターネット通信 (TLS/SSL) を実現する機能
  • JAAS (Java Authentication and Authorization Service) - Javaの認証と権限のサービス

J2SE 5.0 (2004年9月30日)「Tiger」[編集]

言語仕様に大幅な拡張が加えられた[14][15]

  • コレクション用ジェネリクス - コンテナに収納データの型指定ができるようになった。
  • オートボクシング - プリミティブラッパークラスが相互に自動変換されて代入できるようになった。
  • 列挙型 - enumキーワードで定数列挙の型を定義できるようになった。
  • 可変引数 - メソッド引数欄の最終引数の型名+3個のドットで可変個数の引数渡しができるようになった(例 : void drawText(String... lines))。その最終引数は自動的に配列になる。
  • アノテーション - マーカーインターフェースの拡張版。クラス名定義のすぐ上の行に"@"を先頭にした構文を記すと、インスタンスの型を調べる時にチェックできるマーキングとそれに付随する注釈を付与できる。
  • 拡張for文 - コレクションから各要素を順々に取り出すのが便利になるループ文

Java SE 6 (2006年12月11日)「Mustang」[編集]

Java SE 7 (2011年7月28日)「Dolphin」[編集]

2006年に開発が始まった。元々は2008年春にリリースされる見通しであったが[17]、何度かリリース予定が変更された。2007年8月の時点では2009年1月をリリース目標としていたが[18]、2008年12月、ジェームズ・ゴスリンは、「私の勝手な憶測だが」という注意書き付きで、2010年6月以降のリリースを予測し[19]、2009年11月には2010年9月以降のリリース予定に変更された[20]。2010年9月に、これ以上の延期を避けるため、大きな言語仕様の改訂などの部分は Java SE 8 に先送りし、Java SE 7 を2011年中頃に、Java SE 8を2012年終わり頃に提供するという目標を立て[21]、結局2011年7月28日にリリースした。サン社を買収したオラクル社による初のメジャーバージョンリリースである。

Java SE 8 (2014年3月18日)[編集]

ここでコードネームが廃止された。2014年3月4日に JSR 337[22] にて仕様が規定された。JDK 8 は2013年9月9日にリリース予定[23][24]だったが、2013年4月18日にリリースの延期が発表になり2014年3月18日にリリースされた[25][26][27]CLDC, CDC を統合した Java ME 8 は2014年4月30日にリリースされた[28]。主な新機能は以下。

  • ラムダ式の導入 (Project Lambda, JSR 335)
  • 型アノテーション (JSR 308)
  • Date and Time API (JSR 310)
  • 高速JavaScriptエンジン Nashorn
  • JavaFX 8
  • マルチタッチデバイス対応
  • HotspotとJRockitの統合

当初搭載予定だった、以下の機能はJava SE 9に延期となった[29]

  • 言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294)

また、搭載予定だった以下の機能は廃止 (withdrawn) になった。

  • Swing アプリケーションフレームワーク (JSR 296)

Java SE 9 (2017年9月21日)[編集]

Java SE 9 は Java SE 8 リリースの3年後の2017年9月21日にリリースされた。[30]。言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294) などを追加した。

オラクルはJavaの開発速度向上のため、これまでの新機能の完成を待ってメジャーバージョンアップを行うリリースモデルから、毎年3月と9月の年2回メジャーバージョンアップを行うタイムベースのリリースモデルへと移行することを発表した。またサポートサイクルも見直され、Java SE 9は次のメジャーバージョンまでの6ヵ月間のみ公式アップデートが提供されるnon-LTSリリースとなり、2018年3月に公式アップデートが終了した。なお、LTSリリースとなるJava SE 11以降は配布形態が変更されるため、LTSリリースの公式アップデートは提供されなかった[31]

Java SE 10 (2018年3月20日)[編集]

JSR 383[32] にて仕様が規定されたJava SE 10は新リリースモデルによる初リリースで、予定通りJava SE 9から半年後の2018年3月20日にリリースされた[33]。ローカル変数型推論などの機能が追加されている。

Java SE 11 (2018年9月25日)[編集]

JSR 384[34] にて仕様が規定され、2018年9月25日にリリースされた。オラクルによるビルドはOracle JDKとOpenJDKの二種類が提供され、Oracle JDKの商用利用は有償サポート契約を結んだ顧客のみとなっている。リリースモデル変更後の初LTSリリースとなる。

Java SE 12 (2019年3月19日)[編集]

JSR 386にて仕様が規定され、2019年3月19日にリリースされた。Unicode 11がサポートされている。

Java SE 13(2019年9月17日)[編集]

JSR 388にて仕様が規定され、2019年9月17日にリリースされた。

Java言語の構文[編集]

Javaの構文は、CおよびC++から多くを引き継いでいるが、C++と違って名前空間レベルの関数(メソッド)および変数(フィールド)の宣言および定義を許可しておらず、必ず何らかのクラス定義の中に記述することが特徴である。ここではHello worldプログラムの例を用いてJavaプログラミングを説明する。

アプリケーション(コマンドライン)[編集]

コマンドライン環境で動くJavaアプリケーションの例を示す。Javaでは、他のプログラミング言語と同様に、コマンドライン環境で動くプログラムを簡単に開発できる。

// Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

このプログラムについて説明する。

  • Javaのプログラムではすべてをclass内に記述する。コマンドラインのスタンドアロンアプリケーションの場合も同じである。
  • ソースコードファイル名は、そのファイルで記述しているクラスの名前に ".java" というサフィクス(接尾辞、拡張子)を付けるという規則で命名する。
    このプログラム例では、クラス名はHelloであるため、"Hello.java" というソースファイル名にする必要がある。
  • コンパイラは、ソースファイルで定義されている各クラスのクラスファイルバイトコード)を生成する。クラスファイルの名称は、そのクラスの名前に ".class" のサフィクスをつけた名前になる。
    • クラスファイルの生成において、内部クラスの一種である無名クラス (anonymous class) の場合は、クラスファイルの名称は、その無名クラスを含むクラスの名称と整数(0から始まり、無名クラスが複数ある場合は、さらに1、2...と順に付番される)を "$" で連結した文字列に、通常のクラスと同じく ".class" のサフィクスを付けた名前になる。
  • この例のように、スタンドアロンで実行するプログラム(クラス)ではmain()メソッドを定義する必要がある。メソッド定義には振る舞いを記述する。このmainメソッドのシグニチャ(戻り値、引数)は次のようにしなければならない。
    • 戻り値の指定にはvoidキーワードを使う。voidは、そのメソッドが何も戻り値を返さないことを示す。
    • mainメソッドは、パラメタ(引数)として1つのStringの配列を受け取らなくてはならない。このString配列の引数の名称はargsとすることが慣習となっている。ただし引数として可能な名称であれば他の名称でも構わない。
    • mainメソッドにはstaticキーワードをつけなければならない。staticは、そのメソッドがクラスメソッドであることを示す。クラスメソッドは、クラスと関連するメソッドであり、オブジェクトインスタンスに関連するメソッド(インスタンスメソッド)ではない。
    • mainメソッドはpublicキーワードをつけて宣言する。publicは、そのメソッドが他のクラスのコードから呼び出せること、およびそのクラスが他のクラスから呼び出される可能性があることを、示す。ここでの「他のクラス」とは、そのクラスの継承階層に関係なく、他のすべてのクラスを意味する。
  • 印字出力機能は、Javaの標準ライブラリに含まれている。System クラスは public static のフィールド out をもつ。out オブジェクトは、PrintStream クラスのインスタンスであり、標準出力ストリームを表す。PrintStreamクラスのインスタンスである out オブジェクトは、println(String) メソッドを持つ。このメソッドはデータをストリームに出力する。ストリームとは入出力を抽象化した概念である。この場合は、データを画面(out 、標準出力)に出力する。
  • スタンドアロンプログラムを実行するには、Java実行環境に呼び出す対象となる main メソッドを持つクラスの名前を渡すことによって、Java実行環境に実行を指示する。 UNIXWindowsの環境の場合は、カレントディレクトリからjava -cp . Helloをコマンドラインで入力することで、この例のプログラム(Hello.classにコンパイルされたクラス)を実行することができる。
    • 実行するmainメソッドをもつクラス名の指定については、Javaアーカイブ (Jar) ファイルのMANIFESTに記述する方法もある。


サーブレット[編集]

Javaサーブレットは、サーバ側のJava EEの構成要素であり、クライアントから受けた要求 (request) に対する応答 (response) を生成する。現在、多くの場合はウェブブラウザから要求を受け、応答としてXHTML / HTMLウェブページを動的に生成する。

// Hello.java
import java.io.*;
import javax.servlet.*;

public class Hello extends GenericServlet {
    public void service(ServletRequest request, ServletResponse response)
        throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        pw.println("Hello, world!");
    }
}
  • import文は、コンパイル時にJavaコンパイラに対し、このソースコード内ではjava.ioパッケージおよびjavax.servletパッケージ内のすべてのpublicなクラスとインタフェースを、パッケージ名をつけないでクラス名 / インタフェース名だけで使うことを伝える。
  • Hello class extends GenericServlet の部分は、Helloクラスが GenericServletクラスを継承すること(GenericServletサブクラスであること)を記述している。
  • GenericServletクラスは、サーブレットの一般的なフレームワークを提供する。サーバ上で、クライアントから送られてきた要求をサーブレットに渡し、サーブレットのライフサイクルを制御する。
  • HelloクラスはServletで宣言されたservice(ServletRequest, ServletResponse)メソッドをオーバーライドしている。このメソッドは、クライアントからの要求を扱うコードを開発者が記述する場所として、サーブレットフレームワークが開発者に提供しているメソッドである。service(ServletRequest, ServletResponse)メソッドは、ServletRequestオブジェクトとServletResponseオブジェクトをHelloに渡す。HelloServletRequestServletResponseを受け取る。
    • ServletRequestオブジェクトは、クライアントから送られてきた要求を表すオブジェクトである。
    • ServletResponseオブジェクトは、クライアントに送り返す応答を表すオブジェクトである。
  • service(ServletRequest, ServletResponse)メソッドのthrows ServletException, IOExceptionの部分では、このメソッドがServletExceptionもしくはIOException例外を投げる可能性があることを宣言している。これらの例外は、Hello サーブレットの実行中に何らかの問題が起こり、クライアントからの要求に正常な応答を返すことができなくなった場合に投げられる。
  • setContentType(String)メソッドを呼び出して、クライアントに返すデータのMIME Content-Type"text/html" に設定する。
  • getWriter()メソッドを呼び出してPrintWriterオブジェクトを取得する。このオブジェクトを使ってクライアントに返すデータを書き出すことができる。
  • println(String)メソッドを呼び出して、"Hello, world!" 文字列を応答データとして書き出す。
  • そして応答データはソケットストリームに書き出され、クライアントに返される。

Javaプラットフォーム[編集]

Javaプラットフォーム(Java Platform)は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、JREおよびJDKの構成内容と、追加されるJavaテクノロジの組み合わせを変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティ側からも提供されており、その標準化はJavaコミュニティプロセス(JCP)が管理している。Javaテクノロジの中核となるJREとJDKはオープンソース化されているので、各企業各団体及び開発者各自が営利または非営利で膨大な数のソフトウェアと関連技術を公開し、巨大なITエコシステムを構築している。

エディション[編集]

2019年現在、Java権利元のオラクル社は、対象環境に合わせたJavaプラットフォームの4つのエディションを公開している。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。

Java Platform, Standard Edition (Java SE)
スマートフォンやタブレットを含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。
Java Platform, Enterprise Edition (Java EE) / Jakarta EE
サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
2017年9月にOracle社は、Java EEの今後のバージョンアップがエクリプス財団によって行われる事を発表した[35][36]クラウドコンピューティング技術への早期対応に迫られた事がその背景にあったとされる。Java EEの商標は現行版のサポートを続けるOracle社が保持したので、エクリプス財団による今後のバージョンはJakarta EEの名称で公開される事になった[37]
Java Platform, Micro Edition (Java ME)
組み込みシステムマイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
Java Card
スマートカード(ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。現在[いつ?]ではSIMカードATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。

Java実行環境(JRE)[編集]

Java実行環境 (Java Runtime Environment) は、Javaアプリケーションを実行するために必要なソフトウェアである。Java仮想マシン、''Java.exe''などのスターター、各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。

Javaクラスライブラリ

Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。

  1. 基礎ライブラリ - Java言語仕様の基礎を扱う。
  2. 入出力ライブラリ - ファイル入出力など。
  3. データコレクションライブラリ - 配列の操作とList、Set、Mapなどのデータ集合。
  4. 数学ライブラリ - 各種計算。
  5. 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. ネットワークライブラリ - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
  7. GUIライブラリ - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
  8. Javaアプレットライブラリ - アプレット生成用。
  9. Javaビーンズライブラリ - Java版ソフトウェアコンポーネント作成用。
  10. データベース接続ライブラリ - SQLを扱う。
  11. リモートメソッドライブラリ - 外部マシン上にあるプロセス・メソッドを呼び出す。
  12. セキュリティライブラリ - 様々な通信セキュリティプロトコルを扱う。
  13. バッファストリームライブラリ - 連続バイトデータを扱う。
  14. リフレクションライブラリ - クラス定義を動的に操作する。
Javaアプリケーションの形態

Java実行環境に用意されている特定のJavaクラスライブラリを利用する事でJavaプログラムは結果的に、以下の四種類のアプリケーション形態に派生する。

Javaアプリケーション (application)
パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「Java Web Start」は任意のjnlpファイル(java network launching protocol)をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
Javaアプレット (applet)
サーバーからダウンロードされてWEBブラウザ上で実行されるJavaプログラム。サンドボックス機能下で厳しい動作制約が加えられている。当初はJavaの目玉技術であったが、様々な理由からさほど普及しなかった。
Java Cardプラットフォームの分野であるスマートカード(ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。
Javaサーブレット (servlet)
サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。PerlなどによるCGIに比べ、サーバ側の負荷が低いなどのメリットがある。
Javaサーバーページ (server page)
サーブレットをWEBサーバー用に特化したものであり、XHTML (HTML) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバー側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、JavaScriptの様にブラウザ側で実行するスクリプトではない。類似の技術にActive Server PagesPHPがある。

Java開発キット(JDK)[編集]

Java開発キット (Java Development Kit) は、Javaプログラムを開発するための基本的なソフトウェアである。Javaコンパイラなどの基本開発ツール、各種開発サポートツール、テスト用の各種実行サポートツール、Java APIで構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。

  • J2SE 1.2.2_004 までは、JDK(Java Development Kit)と呼んでいた。
  • J2SE 1.4 までは、Java2 SDK(Java2 Software Development Kit)と呼んでいた。
  • J2SE 5.0 からは再び、JDK(Java Development Kit)と呼んだ。
  • JavaSE 7 からは、エンタープライズ版とマイクロ版では Java SDK(Java Software Development Kit)と呼び、スタンダード版とカード版では JDK(Java Development Kit)と呼ぶようになった。JDKはSDKの拡張サブセット(SDKの一部分+その他)とされる。
Java API

APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて各種ソフトウェアの開発を行う。APIは基本的にクラスライブラリの所属に沿って、パッケージ(package)と呼ばれる名前空間で分類されて提供されている。パッケージは各ワードをピリオトで連結して階層化されている。先頭ワードのjavaは開発元提供の純正基礎版を意味する。他に純正拡張版のjavax、サードパーティ提供のorg、comがある。

  1. java.lang - Java言語仕様の基礎を扱う。
  2. java.io - ファイル入出力など。
  3. java.util - 配列の操作とList、Set、Mapなどのデータ集合。
  4. java.math - 各種計算。
  5. java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. java.net - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
  7. java.awt - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
  8. java.applet - アプレット生成用。
  9. java.beans - Java版ソフトウェアコンポーネント作成用。
  10. java.sql - SQLを扱う。
  11. java.rmi - 外部マシン上にあるプロセス・メソッドを呼び出す。
  12. java.security - 様々な通信セキュリティプロトコルを扱う。
  13. java.nio - 連続バイトデータを扱う。
  14. java.lang.reflect - クラス定義を動的に操作する。
統合開発環境と開発支援ツール

統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業および団体から公開されている。

開発サポートツールは、プロジェクト管理、自動ビルド、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。

  • Apache Ant - Javaアプリケーションのビルドツール。Apacheソフトウェア財団のプロジェクトによって開発された。コンパイル、バージョン管理システムとの連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。make と同種のツールであり、XMLファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
  • Apache Maven - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
  • Gradle - Apache AntApache Mavenのコンセプトに基づくオープンソースビルド自動化システム。
  • JUnit - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。xUnitの一種である。テスト駆動開発を支援する。

様々なJavaテクノロジ[編集]

Javaプラットフォームの構成要素であるJavaテクノロジは各企業、各団体、各開発者から様々な形で公開されている。具体的な実装形態としては、主にorgパッケージなどのJava API、JREとJDKを中核にした独自仕様コンテナ、プログラム&ソフトウェアコンポーネント&データベース&通信プロトコル等を組み合わせた統合システムなどがある。各開発元から提示された技術は、Javaコミュニティプロセス(JCP)による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化(standardization)と言う。Javaテクノロジは多岐に渡る分野に存在している。その一例を以下に列挙する。

  • JNDI (Java Naming and Directory Interface) - ネーミングサービスとディレクトリサービスを扱う
  • JSML (Java Speech Markup Language) - 音声合成システムにテキストの注釈を追加する
  • JDBC - データベース接続の API
  • JDO (Java Data Objects) - Javaオブジェクト永続化のインタフェース
  • JAI (Java Advanced Imaging) - 画像を扱うための高水準なオブジェクト指向 API
  • JAIN (Java API for Integrated Networks) - 統合された通信ネットワークの API
  • JDMK (Java Dynamic Management Kit) - JMX仕様に基づいた開発支援ソフトウェア
  • Jini - 分散システムを構築するネットワークアーキテクチャ
  • Jiro - 分散した記憶装置を管理する技術
  • JavaSpaces - 分散環境でJavaオブジェクトの送受信・永続化などを支援する技術
  • JML (Java Modeling Language) - 契約による設計(DbC)を指向した形式言語をソースコードに導入する
  • JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
  • JMX (Java Management Extensions) - 分散オブジェクト環境における管理と監視を行う技術
  • JSF (JavaServer Faces) - WEBクライアントに一定のデザインに基づいたUIを提供するサーバー用技術
  • JNI (Java Native Interface) - 他の言語で実装されたネイティブコードを呼び出す技術
  • JXTA - Peer to Peer (P2P) の仮想ネットワークのためのオープンプロトコル
  • Java 3D - 3次元グラフィクスプログラミングのための高水準な API Java 3D
  • JOGL (Java OpenGL) - OpenGL を使う3Dグラフィクスプログラミングのための低水準な API
  • LWJGL - ゲーム開発用のAPI。OpenGLOpenALOpenCLを扱える。様々なゲーム用コントローラーも扱える。
  • OSGi - サービスの動的な管理と遠隔保守
  • Blu-ray Disc Java - ブルーレイディスクで実行される各種コンテンツ制作用

Javaテクノロジの標準化[編集]

Javaプラットフォームの構成要素であるJavaテクノロジの標準化(standardization)は、Javaコミュニティプロセス(JCP)が管理している。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPが発行している数々のJava仕様要求書(JSRs)によって、Javaテクノロジが準拠すべき仕様規定と技術基準は逐一定められている。その中にはJava言語に追加される新たな言語仕様などのコアテクノロジも含まれている。例として主に5.0版に関連したJSRsを以下に列挙する。

Javaオープンソースモデル[編集]

Javaテクノロジのオープンソース化

1996年のJava登場初期から、ベンダー元のサン社(後にオラクル社が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。2004年になるとIBM社BEAシステムズ社(後にオラクル社が買収)が、この部分的オープンソース制度に便乗する形で、関連ソフトウェアと拡張テクノロジの開発を支援するプロジェクトを立ち上げた。その目的は彼ら独自のJavaオープンソース化を実現する事であり、Java仮想マシンと標準クラスライブラリの互換製品を登場させ、その他の標準化も徐々に進めていた。そうした中でJavaコミュニティプロセスへの影響力低下を懸念したサン社は、このIBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取り続けていた。しかし業界の変化を悟ったサン社は2006年から方針を変えて賛同し、2007年5月8日にはJava SE 6を「OpenJDK」としてGNU一般公開ライセンスの下でリリースした[39]。OpenJDKではソースコードの改変も認められた。「GNU Classpath」は、J2SE 1.4のクラスライブラリの99%以上を実装し[1]、J2SE 5.0では95%以上を実装している[2]。またOpenJDKの開発にはIBM社も協力している。

GNUプロジェクト

GNUプロジェクトは「GNU Interpreter for Java」とGNUコンパイラコレクションのJava版である「GNU Compiler for Java」を公開している。「GNU Compiler for Java」は、ahead-of-timeコンパイル機能を備えており、Javaのソースコードとバイトコードを、ネイティブマシンコード(Windowsではexeファイル)に変換できる。また、Java標準クラスライブラリの互換版である「GNU Classpath」も公開している。Windows環境下の「GNU Compiler for Java」は、MinGW (WindowsAPIを使う為のライブラリ) と併せて、Cygwin(Unix環境を再現するソフトウェア)の環境上で実行できる。なお、Cygwinの使用はGNU一般公開ライセンスに従う必要があるが、MinGWの方はライセンスフリーである。

Windows / Linux用プラットフォーム

メジャーなオペレーティングシステム(OS)では、営利企業および任意団体による独自開発のJREとJDKが公開されている事が多い。

  • Linux / IA-32プラットフォーム : オラクル、Blackdown、IBM、Kaffe.org、GNUプロジェクトなどがJREやJDKを実装・提供している。
  • Windows/IA-32プラットフォーム : オラクル、IBMなどがJREやJDKを実装・提供している。
Excelsior JET

米Excelsior社がExcelsior JETというahead-of-timeコンパイラを販売している[40]。Java SE 用に書かれたプログラムをWindowsのネイティブマシンコードであるexeファイル(実行ファイル)に変換して、起動の高速化やアプリケーションの難読化を実現できる。

Windows用実行ファイル化ツール

JarファイルをWindous用実行ファイル(.exe)にラッピングする以下のツールが存在する。

JSmoothなどは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また、純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。

Java認定資格[編集]

認定パス

オラクル[注釈 1]は複数のJava認定資格を主催している。Javaのバージョンアップに伴って資格も変更されることがある。ただし、変更前に取得した資格は変更後も有効である。認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。

現在受験可能な資格[41][42][43][44]
資格名 レベル 対象バージョン
Java Foundations Certified Junior Associate Junior Associate 不明
Oracle Certified Java Programmer, Bronze SE 7/8[注釈 2] Bronze Java SE 7/8
Oracle Certified Java Programmer, Silver SE 8[注釈 3] Associate Java SE 8
Oracle Certified Java Programmer, Gold SE 8[注釈 4] Professional Java SE 8
Oracle Certified Professional, Java EE 7 Application Developer Professional Java EE 7
Oracle Certified Master, Java EE 6 Enterprise Architect Master Java EE 6
Oracle Certified Expert, Java EE 6 Enterprise JavaBeans Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 JavaServer Faces Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Web Services Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Java Persistence API Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Web Component Developer Expert Java EE 6

脚注[編集]

[ヘルプ]

注釈[編集]

  1. ^ 買収前はサン・マイクロシステムズによって。
  2. ^ 日本でのみ行われている[45]
  3. ^ 日本以外での Oracle Certified Associate, Java SE 8 Programmer に対応。
  4. ^ 日本以外での Oracle Certified Professional, Java SE 8 Programmer に対応。

出典[編集]

  1. ^ What is Java and why do I need it?” (英語). 2019年2月4日閲覧。
  2. ^ PYPL PopularitY of Programming Language index” (英語). pypl.github.io. 2019年10月19日閲覧。
  3. ^ a b Java Software | Oracle”. www.oracle.com. 2019年10月19日閲覧。
  4. ^ 広辞苑 第六版
  5. ^ “JAVASOFT SHIPS JAVA 1.0” (英語) (プレスリリース), Sun Microsystems, オリジナルの2008年6月25日時点におけるアーカイブ。, https://web.archive.org/web/20080625030452/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml 2006年7月8日閲覧。 
  6. ^ “SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED” (英語) (プレスリリース), Sun Microsystems, オリジナルの2008年5月6日時点におけるアーカイブ。, https://web.archive.org/web/20080506220653/http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.xml 2006年7月8日閲覧。 
  7. ^ java.lang.reflect (Java Platform SE 8)” (日本語). 2017年4月1日閲覧。
  8. ^ “SUN DELIVERS NEXT VERSION OF THE JAVA PLATFORM” (英語) (プレスリリース), Sun Microsystems, オリジナルの2008年5月6日時点におけるアーカイブ。, https://web.archive.org/web/20080506220658/http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.xml 2006年7月8日閲覧。 
  9. ^ “SUN MICROSYSTEMS RELEASES FASTEST CLIENT-SIDE JAVA PLATFORM TO DATE” (英語) (プレスリリース), Sun Microsystems, オリジナルの2008年5月16日時点におけるアーカイブ。, https://web.archive.org/web/20080516195335/http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html 2006年7月8日閲覧。 
  10. ^ JavaTM 2 SDK, Standard Edition, version 1.3 の新機能および機能拡張の概要” (日本語). 2019年3月4日閲覧。
  11. ^ JSR 59
  12. ^ “SUN ANNOUNCES LATEST VERSION OF JAVA 2 PLATFORM STANDARD EDITION” (英語) (プレスリリース), Sun Microsystems, オリジナルの2008年9月6日時点におけるアーカイブ。, https://web.archive.org/web/20080906195714/http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html 2006年7月8日閲覧。 
  13. ^ JavaTM 2 SDK, Standard Edition, version 1.4 の新機能および機能拡張の概要” (日本語). 2019年3月4日閲覧。
  14. ^ “Sun Ships New Version of Java Platform” (英語) (プレスリリース), Sun Microsystems, オリジナルの2005年2月15日時点におけるアーカイブ。, https://web.archive.org/web/20050215094036/http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html 2006年7月8日閲覧。 
  15. ^ J2SE(TM) 5.0 の新機能” (日本語). 2006年7月8日閲覧。
  16. ^ 「Java SE 6 Update 10」公開、動作速度を高速化” (日本語). 2008年12月3日閲覧。
  17. ^ Evolving a Language” (英語). 2006年4月5日時点のオリジナル[リンク切れ]よりアーカイブ。2006年7月8日閲覧。
  18. ^ The Open Road: Looking Ahead to Java 7” (英語). 2008年12月22日時点のオリジナル[リンク切れ]よりアーカイブ。2006年7月8日閲覧。
  19. ^ Javaがレガシーだって? 冗談じゃないよ - James Goslingが語るJavaの現在” (日本語). 2018年4月7日閲覧。
  20. ^ JDK 7が、突然"単純な"クロージャをサポート、しかしリリースは、2010年の終わりに。” (日本語). 2009年12月3日閲覧。
  21. ^ It's time for … Plan B”. 2010年9月23日閲覧。
  22. ^ JSR 337: Java SE 8 Release Contents
  23. ^ Java SE 8リリース予定を延期 - 2013年夏へ - エンタープライズ - マイナビニュース” (日本語). 2012年2月22日閲覧。
  24. ^ Java SE 8 Platform Umbrella JSR (337)
  25. ^ Java 8: Secure the train” (英語). 2013年4月23日閲覧。
  26. ^ Java 8リリースに遅れ、2014年3月へ - マイナビニュース” (日本語). 2013年4月23日閲覧。
  27. ^ Java 8 officially arrives at last” (英語). 2014年3月19日閲覧。
  28. ^ 7年ぶりのJavaOne Tokyoでは「Javaテクノロジーのすべてを見せる」 - クラウド Watch” (日本語). 2012年2月22日閲覧。
  29. ^ Project Jigsaw: On the next train” (英語). 2013年1月13日閲覧。
  30. ^ JDK 9”. 2015年6月29日閲覧。
  31. ^ Oracle Java SE サポート・ロードマップ” (日本語). 2018年10月19日閲覧。
  32. ^ JSR 383: Java™ SE 10 (18.3)
  33. ^ JDK 10”. 2018年6月17日閲覧。
  34. ^ JSR 384: JavaTM SE 11 (18.9)
  35. ^ Opening Up Java EE - An Update” (英語). Oracle (2017年9月12日). 2019年3月10日閲覧。
  36. ^ EE4J、EclipseファウンデーションがオープンソースJava EEを準備” (日本語). InfoQ (2017年11月16日). 2019年3月10日閲覧。
  37. ^ Java EE は Jakarta EE となる” (日本語). InfoQ (2018年3月5日). 2019年3月10日閲覧。
  38. ^ 星 暁雄=日経BP Javaプロジェクト (2003年10月31日). “EclipseとWebSphere Studioはどう違うのか | 日経 xTECH(クロステック)”. 日経 xTECH(クロステック). Nikkei Business Publications, Inc.. 2019年11月17日閲覧。
  39. ^ Sun Microsystems, Inc (2007年5月8日). “Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community”. 2009年9月16日閲覧。
  40. ^ http://www.excelsior-usa.com/jet.html
  41. ^ オラクル Java SE 認定資格パス 概要”. 2019年3月7日閲覧。
  42. ^ オラクル Java EE and Web Services 認定資格パス 概要”. 2019年3月7日閲覧。
  43. ^ Java Foundations Certified Junior Associate (novice-level certification)”. 2019年3月10日閲覧。
  44. ^ 認定試験一覧”. 2019年3月7日閲覧。
  45. ^ Java資格が大幅リニューアル。Bronze/Silver/Goldが登場”. 2019年3月7日閲覧。

参考文献[編集]

関連項目[編集]

外部リンク[編集]

オラクル・JCP関連
技術情報