12 April 2015

(Java) javacコンパイラとclass/jarファイルの実行方法

javaソースコードのコマンドラインでのコンパイル方法と実行方法のメモ

1.外部ライブラリを使わないプログラムの場合

javaコードのサンプル例

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

コンパイル

コンパイルして出力される .class ファイルは、機種依存しない中間コードのため、LinuxでもWindowsでも動作可能。ただし、依存するう(読み込む)ライブラリは機種依存の可能性があるため、その場合は外部jarは機種ごとに配布の必要あり。

$ javac Test.java

このコマンドを実行すると、カレントディレクトリにTest.classファイルが出力される。(Test$1.classなど)他のファイルも生成される可能性があるが、それらもプログラムの実行時には必要となるので、一式で保存・コピー等すること。

特定のjavaバージョン用にクロスコンパイルする場合。次の例は Java 7 (ver 1.7) 用にクロスコンパイルする例である

$ javac -source 1.7 -target 1.7 Test.java

実行

Linux または Windows の場合
$ java Test

2.外部ライブラリを使わないプログラムの場合 (パッケージ指定)

javaコードのサンプル例

Test.java
package com.example.test1;
 
public class Test {
    public static void main(String args[]) {
        System.out.println("Hello World!");
    }
}

コンパイル

-d オプションで『生成されたクラス・ファイルを格納する位置(ディレクトリ)』を指定している。次の例では、カレントディレクトリを示している。

$ javac -d ./ Test.java

このコマンドの結果は、カレントディレクトリにサブディレクトリが作成され./com/example/test1/Test.classが作成される。

実行

com/example/test1親ディレクトリ

Linux または Windows の場合
$ java com.example.test1.Test

3.外部ライブラリを使う場合

ここでは、たとえばSWTライブラリ (swt.jar)を使う場合を想定する。

javaコードのサンプル例

Test.java
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
 
public class Test {
    public static void main(String args[]) {
        Display display = new Display();
        Shell shell = new Shell(display, SWT.SHELL_TRIM);
        shell.setLayout(new RowLayout(SWT.HORIZONTAL));
        Label label = new Label(shell, SWT.NONE);
        label.setText("Text");
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

コンパイル

$ javac -classpath /usr/local/eclipse/swt/swt.jar Test.java

このコマンドを実行すると、カレントディレクトリにTest.classファイルが出力される。

実行

Linux の場合
$ java -classpath .:/usr/local/eclipse/swt/swt.jar Test

そして、同じTest.classファイルをWindows環境にコピーし、Windows用のswt.jarをc:\windows\swt\swt.jarに置いているとして

Windows の場合
$ java -classpath .;c:\windows\swt\swt.jar Test

複数ディレクトリやファイルを区切る場合、Linixのはコロン『:』を、Windowsはセミコロン『;』を使う。また、メイン・クラスを検索する場所が -classpath オプションで上書きされてしまうため、必ず最初にカレントディレクトリを含めるよう指定する。

ライブラリ .dll/.soが必要で、標準のライブラリ・パス以外にある場合

$ java -classpath .:/usr/local/eclipse/swt/swt.jar -Djava.library.path=/usr/lib/XXXX/ Test

4.外部ライブラリ無しのjarパッケージの作成

上述 『2.外部ライブラリを使わないプログラムの場合 (パッケージ指定)』の結果を jar パッケージする例を示す。

カレントディレクトリに、./com/example/test1サブディレクトリが有り、その中にTest.classファイルが存在している。

メイン・クラスを指定するために、カレントディレクトリにマニフェストファイルを作成する

Manifest.txt
Manifest-Version: 1.0
Main-Class: com.example.test1.Test

ここまで用意できれば、jar パッケージングを行う

$ jar cvfm Test.jar Manifest.txt com/example/test1/*.class

パッケージ後のファイルの実行は

$ java -jar Test.jar

4.外部ライブラリ有りのjarパッケージの作成

上述 『3.外部ライブラリを使う場合』の結果を jar パッケージする例を示す。また、今回はプログラムがパッケージを用いているとして、少し混みいった例を示す

Test.java
package com.example.test1;
 
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
 〜 以下省略 〜

カレントディレクトリに、./com/example/test1/サブディレクトリが有り、その中にTest.class等のclassファイルが存在している。

メイン・クラスを指定するために、カレントディレクトリにマニフェストファイルを作成する。次の例ではjar実行時には、カレントディレクトリに swt.jar が存在していると仮定している。

Manifest.txt
Manifest-Version: 1.0
Main-Class: com.example.test1.Test
Class-Path: ./swt.jar

ここまで用意できれば、jar パッケージングを行う

$ jar cvfm Test.jar Manifest.txt com/example/test1/*.class

パッケージ後のファイルの実行は、カレントディレクトリに Test.jar と swt.jar を置いた状態で

$ java -jar Test.jar