別の記事で掲載したバッチファイルから呼び出されるJava側の入り口のクラスを記述する。
AppMainはmainメソッドを持つプログラムエントリポイントとなるクラスである。
ここではCommandInterfaceというインタフェースによって、複数のJavaクラスの呼び分けができるようになっている。
Javaクラスをバッチから呼び出したい場合、全てのクラスにmainを記述するのは移植性の面で問題がある。mainメソッドはstaticであるため、ついついロジック本体のクラスをnewせずにメンバ等も全てstaticに書いてしまいがちである。
入り口はstaticなmainメソッドでもよいが、実際にはそこから複数のロジックを呼び出したい。
そのような場合は、入り口クラスに呼び出したいロジッククラスの完全修飾名を渡し、更に必要な引数も渡せる仕組みが必要である。
入り口が String[] args というパラメータしか取れないので、これと全く同じ戻り値と引数を持つインターフェースを作成し、個々のロジッククラスを呼び出すように記述している。
CommandInterface他のソースコードは、別の記事として掲載する。
<以下、ソースコード>
package app;
import org.apache.log4j.Logger;
import cmd.CommandInterface;
import exception.AppException;
/**
* プログラムエントリポイント
*/
public class AppMain {
/** ログ */
private static Logger log = Logger.getLogger(AppMain.class.getName());
/**
* プログラムエントリポイント
*
* @param args
* コマンドライン引数
*/
public static void main(String[] args) {
try {
// コマンドライン引数が指定されていない場合は、エラーとする
if (args == null || args.length == 0) {
throw new AppException("コマンドライン引数がありません。");
}
// 第1引数がクラスでない場合は、エラーとする
CommandInterface ommandInterface = null;
try {
Class<?> clazz = Class.forName(args[0]);
ommandInterface = (CommandInterface) clazz.newInstance();
} catch (Exception e) {
writeStarckTraceLog(e);
return;
}
// メイン処理を呼び出す
ommandInterface.doMain(args);
} catch (AppException e) {
writeStarckTraceLog(e);
} catch (Exception e) {
writeStarckTraceLog(e);
}
}
/**
* 例外のスタックトレースをログに記録する。
*
* @param e
* 例外
*/
private static void writeStarckTraceLog(Exception e) {
String crlf = System.getProperty("line.separator");
StringBuffer msg = new StringBuffer(e.getClass().getName() + " "
+ e.getMessage() + crlf);
StackTraceElement[] elements = e.getStackTrace();
if (elements != null && elements.length > 0) {
for (StackTraceElement element : elements) {
msg.append("\t" + element.toString() + crlf);
}
}
log.error(msg);
}
}
0 件のコメント:
コメントを投稿