2015年1月24日土曜日

[Java][batch]Javaプログラムをバッチファイルから実行する(AppMain.java)

別の記事で掲載したバッチファイルから呼び出される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 件のコメント:

コメントを投稿