javaソースコードのコマンドラインでのコンパイル方法と実行方法のメモ
1.外部ライブラリを使わないプログラムの場合
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
実行
$ java Test
2.外部ライブラリを使わないプログラムの場合 (パッケージ指定)
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
の親ディレクトリで
$ java com.example.test1.Test
3.外部ライブラリを使う場合
ここでは、たとえばSWTライブラリ (swt.jar)を使う場合を想定する。
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
ファイルが出力される。
実行
$ java -classpath .:/usr/local/eclipse/swt/swt.jar Test
そして、同じTest.classファイルをWindows環境にコピーし、Windows用のswt.jarをc:\windows\swt\swt.jarに置いているとして
$ 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-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 パッケージする例を示す。また、今回はプログラムがパッケージを用いているとして、少し混みいった例を示す
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-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