0

Javaアプリケーション内でバッチファイルを実行したい。

私はそれをこのように実行したい:

   String[] args = new String[] {
                    "C:/Users/User1/Desktop/Bachelor Thesis/JDBC Connector/jdbc_5.2_sp1_patch05/bin/connect.bat",
                    "start",
                    "-f",
                    "C:/Users/User1/Content-Integration Testing Framework/JDBC Connector/etc/db.xml" };

Process p = Runtime.getRuntime().exec(args);
p.waitFor();

            BufferedReader prout = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            String buffer;
            while ((buffer = prout.readLine()) != null) {
                System.out.println(buffer);
                buffer = prout.readLine();
            }

説明のために:
私が通常のcmd実行を使用すると考えてみましょう。cmdを開いてから、自分のディレクトリに移動します。

cd C:/Users/User1/Desktop/Bachelor Thesis/JDBC Connector/jdbc_5.2_sp1_patch05/bin

戦後、次のコマンドでバッチファイルを開始します。

connect start -f C:/Users/User1/Content-Integration Testing Framework/JDBC Connector/etc/db.xml

コマンドラインではこれは正常に機能し、バッチを開始し、このバッチ内に開始されるサブプロセスがあります。

if exist %JAVA_HOME%\bin\java.exe (
java -XX:NewSize=%NEWSIZE% -XX:NewRatio=1 -Xms%MAXHEAP% -Xmx%MAXHEAP% -Dfile.encoding=%ENCODING% -Djava.ext.dirs=%EXT_DIR% com.fastsearch.esp.connectors.jdbc.JDBCConnector %1 %2 %3 %4 %5 %6 %7
) else (echo Is JAVA_HOME=%JAVA_HOME% set correctly?)

しかし、Javaアプリケーション内で実行すると、次の問題が発生します。バッチファイルの最初のエコーのみが出力され、サブプロセスが開始されません。エラーストリームをキャッチすると(上のコードに示されているように)、次のように表示されます。

UNC-Pfade werden nicht unterstützt. (UNC-Paths are not supported)
java.lang.NoClassDefFoundError: com/fastsearch/esp/connectors/jdbc/JDBCConnector

いくつかの調査の結果、現在の作業ディレクトリなどが原因で、cmdにサブプロセスの開始に問題があることがわかりました。私はそれを本当に理解していませんでした。

実際には、Javaアプリケーション内で必要なパラメーター(start、-f、およびパス)を使用してバッチファイルを実行したいと考えています。cmdでステートメントを直接実行すると、すべてが正常に機能しますが、Javaアプリケーション内では問題が発生します。

これが完全なバッチファイルです、多分これは役に立ちます:

@echo off
rem This bat file should setup the java env and run the connector manager
SETLOCAL

echo Copyright (c) Microsoft Corporation.  All rights reserved.

rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rem Java 1.6 must be installed and set here
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

if NOT defined JAVA_HOME (
   echo Sorry..
   echo You have NOT set JAVA_HOME - Should point to where JRE 1.6.x or later is installed
   echo Exiting.......
   goto end
)
set JAVA_HOME=%JAVA_HOME%
:: Remove quotes if exist, then add quotes in case spaces
SET JAVA_HOME=###%JAVA_HOME%###
SET JAVA_HOME=%JAVA_HOME:"###=%
SET JAVA_HOME=%JAVA_HOME:###"=%
SET JAVA_HOME=%JAVA_HOME:###=%
SET JAVA_HOME="%JAVA_HOME%"

SET PATH=%JAVA_HOME%\bin
SET EXT_DIR=..\lib;%JAVA_HOME%\lib;%JAVA_HOME%\lib\ext
SET CLASSPATH=..\etc
SET MAXHEAP=1408m
SET NEWSIZE=256m
SET ENCODING=UTF8

if exist %JAVA_HOME%\bin\java.exe (
java -XX:NewSize=%NEWSIZE% -XX:NewRatio=1 -Xms%MAXHEAP% -Xmx%MAXHEAP% -Dfile.encoding=%ENCODING% -Djava.ext.dirs=%EXT_DIR% com.fastsearch.esp.connectors.jdbc.JDBCConnector %1 %2 %3 %4 %5 %6 %7
) else (echo Is JAVA_HOME=%JAVA_HOME% set correctly?)

:end
4

2 に答える 2

1

触れたように、問題は適切なディレクトリからバッチファイルを実行していないことである可能性が高いです。コマンドラインコンソールを開いてcdバッチファイルを含むディレクトリに移動すると、そのアクションによって適切なcurrent working directory(CWD)が設定されます。

バッチファイルを入力する前または後にCWDを変更することで解決できます。


バッチファイルでCWDを操作することから始めましょう。ここにもいくつかのオプションがありますが、シンプルに保ち、CWDを変更するだけです。

set MYDIR=%~dp0
cd %MYDIR%

最初の行は、バッチファイルの魔法を少し使って、現在実行中のバッチファイルが存在するディレクトリを取得します。これは、「C:/ Users / User1 / Desktop / Bachelor Thesis / JDBC Connector / jdbc_5.2_sp1_patch05 /bin/」になります。

の代替形式を使用してRuntime.getRuntime().exec()、CWDを変更できます。
Runtime.getRuntime().exec(String[] cmdarray, String[] envp, File dir)

次のように呼び出します。

File workingDir = new File("C:/Users/User1/Desktop/Bachelor Thesis/JDBC Connector/jdbc_5.2_sp1_patch05/bin/");
Runtime.getRuntime().exec(args, null, workingDir);

static final const作業ディレクトリの値を宣言するか、プログラムでその値のハードコーディングを排除する方法を見つけることを強くお勧めします。

于 2012-07-30T14:55:40.117 に答える
0

正解をまとめて書き留めておきたいと思います。しかし、これはリチャード・シッツェの考えであり、私の考えではないことを言及しなければなりません。

static final String workingdirectory = "C:/Users/User1/Desktop/Bachelor Thesis/JDBC Connector/jdbc_5.2_sp1_patch05/bin"; 
    String[] args = new String[] {"C:/Users/User1/Desktop/Bachelor Thesis/JDBC Connector/jdbc_5.2_sp1_patch05/bin/connect.bat",
            "start",
            "-f",
            "C:/Users/User1/Content-Integration Testing Framework/JDBC Connector/etc/db.xml" };
    Process p = Runtime.getRuntime().exec(args2, null, workingDir);
    BufferedReader prout = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String buffer;
                while ((buffer = prout.readLine()) != null) {
                    System.out.println(buffer);
                    buffer = prout.readLine();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
于 2012-08-02T07:12:31.603 に答える