gpt4 book ai didi

Java 应用程序 : Execute Batch File with subprocess/UNC Path

转载 作者:行者123 更新时间:2023-12-01 15:15:09 26 4
gpt4 key购买 nike

我想在我的 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

最佳答案

正如您所提到的,您的问题很可能是您没有从正确的目录执行批处理文件。当您打开命令行控制台并 cd 进入包含批处理文件的目录时,该操作会设置正确的当前工作目录 (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 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 值,或者找到某种方法来消除程序中该值的硬编码。

关于Java 应用程序 : Execute Batch File with subprocess/UNC Path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11721294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com