jiichan.com

PROGRAMMING

Java
javascript
CSS
PHP

javaのコンパイルと実行

netbeansなどIDEを使っていると、javaのコンパイルや実行など意識することが無い。 そこでコマンドプロンプトでコンパイル・実行をやってみた。するとファイルにpackageがあると上手くいかない。
試行錯誤してようやくできたので、フォルダとファイルの位置関係などを忘れないように記録しておく。

javaのソースコード

C:\JavaSample\abc\App.java

package abc;

public class App {
    public static void main( String[] args ) {
        System.out.println( "Hello World!" );
    }
}

コマンドプロンプトでコンパイル

当然だがJDKにはシステム環境変数pathを設定しておく。
javacでコンパイルする。

C:\JavaSample\abc>javac App.java

コンパイルされたApp.classがソースファイルと同じabc(package)フォルダにできる。

コンパイル済のclassファイルを実行する

実行はjavaコマンドにクラス名を指定する。拡張子classは付けない。

C:\JavaSample\abc>java App
エラー:メイン・クラスAppが見つからなかったかロードできませんでした

実行してもエラーがでる。
これがどうもわからなかった。
いろいろネットを検索したら、ソースにpackage指定がある場合はpackage.クラス名で実行するらしい。
そこでcdコマンドでひとつ上の階層に移り実行することになる。

C:\JavaSample\abc>cd ..
C:\JavaSample>java abc.App
Hello World!

実行に成功し「Hello World!」が出力された。

jarファイルの作成

jarは単独または複数のクラスファイルなどを圧縮ファイル(zip)化したもので、アプリケーションの配布などが容易になる。

jarの作成はjarコマンドを利用する。

jarには複数のクラスが含まれる(場合が多い)ので、どのクラスのmainメソッドからスタートするのかをマニフェストファイル(MANIFEST.MF)で教えることになる。

そのマニフェストファイルは、jarコマンドでjarファイル作成時に自動的にjarファイルの中のMETA-INFフォルダに作成される。
そのマニフェストファイルの Main-Class にメイン・クラスを指定することで時javaコマンドはjarを実行できる。
メイン・クラスの指定はマニフェストファイルの Main-Class を書き換えて行うので(別な方法もある)書き換え用のテキストファイルを作成する。
テキストファイルはpackage(abc)と同じ階層に置く。ファイル名はとりあえずmanifest.txtとした。

C:\JavaSample\manifest.txt
mamifest.txtの中身は次の一行だけ。

Main-Class: abc.App↲

Main-Class: のクラス名には、package(abc)があるのでクラス名の前にpackage名abcを付けなければならない。
また、Main-Class:とabc.Appの間は半角スペース1文字を必ずいれる。また行の最後には改行がなければならない。

jarのオプションには
-c 圧縮ファイルの新規作成 -v コマンドラインに処理内容を表示 -f jarファイル名の指定 -m マニフェストファイルの内容を指定 などがある。

実行してみる。

C:\JavaSample>jar -cvfm App.jar manifest.txt abc\*.class
マニフェストが追加されました
abc/App.classを追加中です(入=416)(出=290)(30%収縮されました)

テキストファイルと同じフォルダにApp.jarができる。
jarファイルを解凍し、マニフェストファイル(MANIFEST.MF)を除いてみると

Manifest-Version: 1.0↲
Created-By: 1.8.0_73 (Oracle Corporation)↲
Main-Class: abc.App↲

このようになっていた。
各項目と項目値の間は半角スペース1文字が入っている。また行の最後には改行がある。

jarを実行してみる

C:\JavaSample>java -jar App.jar
Hello World!

「Hello World!」が出力された。
今回はクラスファイルがひとつだけだが、そのうち複数のクラスファイルで試してみよう。
ここまでのようなことをする必要がないIDEは便利だなあ。