0

サーブレットからJavaのProcessBuilderを使用して、jarファイルのクラス内でMainメソッドを実行しようとしています。他の依存関係があるため、これを別のプロセスで実行する必要があります。

次の例外が発生しているので、引数配列でパッケージとMainメソッド名(com.test.Main)を正しく渡していないようです。これを正しく行う方法がわかりません。

何か提案をいただければ幸いです。ありがとう。

エラー-java.lang.NoClassDefFoundError:com / test / Mainエラー-原因:java.lang.ClassNotFoundException:com.test.Mainエラー-java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)エラー-java.security.AccessController.doPrivileged(ネイティブメソッド)でエラー-java.net.URLClassLoader.findClass(URLClassLoader.java:190)でエラー-java.lang.ClassLoader.loadClass(ClassLoader.java:307)で)エラー-sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)で

エラー-java.lang.ClassLoader.loadClass(ClassLoader.java:248)でエラー-メインクラスが見つかりませんでした:com.test.Main。プログラムは終了します。エラー-スレッド「メイン」の例外

これが私のコードです。

    public int runProcessBuilder() throws IOException, InterruptedException{
    {
        // Get absolute path
        File dir_location = new File(".");
        String appPath = dir_location.getCanonicalPath() + "\\Tomcat 6.0\\webapps\\TestServer\\WEB-INF";

        // Args to run
        String[] argList = {"java.exe","-Djava.library.path="+appPath+"\\lib","-classpath",appPath+"\\lib\\test.jar","com.test.Main","-pTEST_ARG","123"};           

        // Create ProcessBuilder
        ProcessBuilder builder = new ProcessBuilder(argList);

        // Set Environment variable(s)
        Map<String, String> environ = builder.environment();
        environ.put("TEST_HOME", appPath);

        // Set java directory - TODO: use system property
        String java_exe = "C:\\Program Files\\Java\\jdk1.6.0_18\\bin";
        builder.directory(new File(java_exe));

        // Start Process
        final Process process = builder.start();

        // Read error stream
        StreamReader errorReader = new StreamReader(process
                .getErrorStream(), "ERROR");

        // Read input stream
        StreamReader outputReader = new StreamReader(process
                .getInputStream(), "OUTPUT");

        // Start both reader threads
        errorReader.start();
        outputReader.start();

        // Wait for process end and get Exit Code
        int exitCode = process.waitFor();
        System.out.println("Exit code: " + exitCode);

        return exitCode;
      }
}
4

2 に答える 2

1

「-classpath」引数または使用しようとしているJARファイルに問題があります。

  • 「-classpath」引数の値を出力し、JARファイルが実際にファイルシステム内のその場所にあり、読み取り可能であることを確認します。

  • jar -tvf test.jar | grep ...MainクラスがJARファイルにあり、JARに正しいパスがあることを確認するために使用します。

(問題となるのはマニフェストではありません...「-jar」を使用していないためです。)

main(これは、エントリポイントメソッドのシグネチャの問題でもありません...別の例外が発生するためです。)

于 2011-04-10T03:20:19.527 に答える
0

jarのマニフェストファイルにMain-Class値を設定しましたか?

それは次のようになります:

Main-Class: com.test.Main

実行中のJARパッケージソフトウェアのドキュメントを確認することをお勧めします。

于 2011-04-10T03:19:00.780 に答える