Я хочу выполнить пакетный файл в своем 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 есть проблемы с запуском подпроцессов из-за текущего рабочего каталога или чего-то в этом роде. Я действительно этого не понимал.
Дело в том, что я хочу выполнить пакетный файл с его необходимыми параметрами (начало, -f и путь) в моем приложении Java. Когда я выполняю операторы непосредственно в 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