首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java应用程序:使用子进程/ UNC路径执行批处理文件

Java应用程序:使用子进程/ UNC路径执行批处理文件
EN

Stack Overflow用户
提问于 2012-07-30 20:12:01
回答 2查看 1.6K关注 0票数 0

我想在java应用程序中执行一个批处理文件。

我想这样执行它:

代码语言:javascript
复制
   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,然后转到我的目录:

代码语言:javascript
复制
cd C:/Users/User1/Desktop/Bachelor Thesis/JDBC Connector/jdbc_5.2_sp1_patch05/bin

在with之后,我将使用以下命令启动批处理文件:

代码语言:javascript
复制
connect start -f C:/Users/User1/Content-Integration Testing Framework/JDBC Connector/etc/db.xml

在命令行上,这可以很好地工作,它启动批处理,并且在这个批处理中有一个子进程启动:

代码语言:javascript
复制
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应用程序中执行时,我遇到了以下问题:它只打印批处理文件的第一个echo,但是子进程没有启动。当我捕捉到errorstream (如上面的代码所示)时,它会说:

代码语言:javascript
复制
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应用程序中却很糟糕。

下面是完整的批处理文件,可能会对您有所帮助:

代码语言:javascript
复制
@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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-30 22:55:40

正如您提到的,您的问题很可能是您没有从正确的目录执行批处理文件。当您打开命令行控制台并进入包含批处理文件的目录时,该操作将设置正确的current working directory (CWD)。

您可以通过在输入批处理文件之前或之后更改CWD来解决此问题。

让我们从批处理文件中的CWD开始;我们在这里也有许多选项,但让我们保持简单,只更改CWD:

代码语言:javascript
复制
set MYDIR=%~dp0
cd %MYDIR%

第一行使用一些批处理文件魔术来获取当前正在执行的批处理文件所在的目录。这将是“C:/Users/User1/Desktop/学士论文/jdbc连接器/jdbc_5.2_sp1_patch05/bin/”

替代方案

您可以使用Runtime.getRuntime().exec()的另一种形式来更改CWD:

Runtime.getRuntime().exec(String[] cmdarray, String[] envp, File dir)

调用方式:

代码语言:javascript
复制
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值,或者找到一些方法来消除程序中对该值的硬编码。

票数 1
EN

Stack Overflow用户

发布于 2012-08-02 15:12:32

现在我想写下正确的答案作为总结。但我必须指出,这是Richard Sitze的想法,而不是我的。

代码语言:javascript
复制
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();
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11721294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档