我想在我的 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
Afterwars 我将使用以下命令启动批处理文件:
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 应用程序中执行带有必要参数(开始、-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