【问题标题】:Why can't I get Java ProcessBuilder to execute in my windows 10 computer?为什么我不能让 Java ProcessBuilder 在我的 Windows 10 计算机上执行?
【发布时间】:2021-04-08 14:40:21
【问题描述】:

我在使用 Processbuilder 执行 Windows 程序时遇到问题。 下面的代码生成一个命令数组,如:

C:\\Program Files\\Gdal\\bin\\gdal\\apps\\gdalwarp.exe, -t_srs, EPSG:32633, -et, 1, -r, near, H:\\GeoData\\Raster\\1M_WEF30JAN2020_WGS84LL_somlos_8.tif, H:\\GeoData\\Raster\\result.tif

String [] cmd = {"C:\\Program Files\\Gdal\\bin\\gdal\\apps\\gdalwarp.exe",
  "-t_srs",  "EPSG:" + txtEPSG.getText(), 
  "-et", txtThreshold.getText().trim(),
  "-r", cmbBoxResampl.getSelectedItem().toString(),
  txtInFilename.getText(),
  txtNewFilename.getText()
};
boolean r = Files.isExecutable(new File("C:\\Program Files\\Gdal\\bin\\gdal\\apps\\gdalwarp.exe").toPath());
java.lang.ProcessBuilder b = new java.lang.ProcessBuilder(cmd);
b.redirectError(ProcessBuilder.Redirect.INHERIT);
b.redirectInput(ProcessBuilder.Redirect.INHERIT);
Map<String,String> map = b.environment();
Process p = b.start();
int rc = p.waitFor();
if (p.exitValue() != 0) {
  System.out.println(p.exitValue());
  System.out.println("Command: " + cmd[0]);
  InputStream errorStream = p.getErrorStream();
  int c = 0;
  while ((c = errorStream.read()) != -1) {
    System.out.print((char)c);
 }
}

当我调试 java 程序时,我可以看到 gdalwarp.exe 是可执行的,并且环境设置与我在 cmd 终端中执行 gdalwarp.exe 时相同。 processBuilder 似乎没有执行 gdalwarp。我得到的退出代码是-1073741511,它应该是0或-1。 errorStream 是空的,我没有打印出来。

当我执行 C:\Program Files\Gdal\bin\gdal\apps\gdalwarp.exe -t_srs EPSG:32633 -et 1 -r near H:\GeoData\Raster\1M_WEF30JAN2020_WGS84LL_somlos_8.tif H:\GeoData\Raster\result.tif 在 cmd 终端中,我得到有意义的输出和生成的文件:H:\GeoData\Raster\result.tif。

我尝试过使用和不使用 gdalwarp.exe 的路径,但它仅在 cmd 终端中有效。 有什么想法吗?

当我使用 ProcessBuilder 执行 cmd.exe 时,我得到了有意义的输出。

--更新----

当我在程序中为退出代码、isExecutable、env.variables 添加打印输出时,我得到了这个:

Command: C:\Program Files\Gdal_321\bin\gdal\apps\gdalwarp.exe, -t_srs, EPSG:32633, -et, 1, -r, near, C:\Temp\1M_WEF30JAN2020_WGS84LL_somlos_8_overview.tif, C:\Temp\1M_WEF30JAN2020_8_overview.tif

C:\Program Files\Gdal_321\bin\gdal\apps\gdalwarp.exe is exacutable

Exit value:-1073741511

一系列 process.env.variables:

PROCESSOR_LEVEL, 6

JAVA_HOME, C:\Program Files\OpenJDK\jdk-8.0.262.10-hotspot\jre

POSTGIS_GDAL_ENABLED_DRIVERS, GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid

GDAL_DATA, C:\Program Files\Gdal_321\bin\gdal-data

GDAL_DRIVER_PATH, C:\Program Files\Gdal_321\bin\gdal\plugins;C:\Program Files\Gdal_321\bin\gdal\plugins-external

PROCESSOR_ARCHITECTURE, AMD64

PSModulePath, C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

SystemDrive, C:

POSTGIS_ENABLE_OUTDB_RASTERS, 1

ProgramFiles(x86), C:\Program Files (x86)

CommonProgramFiles, C:\Program Files\Common Files

Path, C:/Users/anpaumal/.p2/pool/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_14.0.2.v20200815-0932/jre/bin/server;C:/Users/anpaumal/.p2/pool/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_14.0.2.v20200815-0932/jre/bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Python\Python39\;C:\Program Files\OpenJDK\jdk-8.0.262.10-hotspot\jre\bin;C:\Program Files\Gdal_321\bin;C:\Program Files\Gdal_321\bin\gdal\python\osgeo;C:\Program Files\Gdal_321\bin\proj6\apps;C:\Program Files\Gdal_321\bin\gdal\apps;C:\Program Files\Gdal_321\bin\ms\apps;C:\Program Files\Gdal_321\bin\gdal\csharp;C:\Program Files\Gdal_321\bin\curl;C:\Users\anpaumal\AppData\Local\Microsoft\WindowsApps;C:\Program Files\eclipse;

PATHEXT, .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

DriverData, C:\Windows\System32\Drivers\DriverData

OS, Windows_NT

PROJ_LIB, C:\Program Files\Gdal_321\bin\proj7\SHARE

PROCESSOR_REVISION, 9e0d

CommonProgramW6432, C:\Program Files\Common Files

ProgramData, C:\ProgramData

ProgramW6432, C:\Program Files

CommonProgramFiles(x86), C:\Program Files (x86)\Common Files

ProgramFiles, C:\Program Files

以及系统环境中的一系列设置:

ALLUSERSPROFILE=C:\ProgramData

CommonProgramFiles=C:\Program Files\Common Files

CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files

CommonProgramW6432=C:\Program Files\Common Files

DriverData=C:\Windows\System32\Drivers\DriverData

GDAL_DATA=C:\Program Files\Gdal_321\bin\gdal-data

GDAL_DRIVER_PATH=C:\Program Files\Gdal_321\bin\gdal\plugins;C:\Program Files\Gdal_321\bin\gdal\plugins-external;

JAVA_HOME=C:\Program Files\OpenJDK\jdk-8.0.262.10-hotspot\jre

NUMBER_OF_PROCESSORS=12

OS=Windows_NT

Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Python\Python39\;C:\Program Files\OpenJDK\jdk-8.0.262.10-hotspot\jre\bin;C:\Program Files\Gdal_321\bin;C:\Program Files\Gdal_321\bin\gdal\python\osgeo;C:\Program Files\Gdal_321\bin\proj6\apps;C:\Program Files\Gdal_321\bin\gdal\apps;C:\Program Files\Gdal_321\bin\ms\apps;C:\Program Files\Gdal_321\bin\gdal\csharp;C:\Program Files\Gdal_321\bin\curl;C:\Users\anpaumal\AppData\Local\Microsoft\WindowsApps;

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

ProgramData=C:\ProgramData

ProgramFiles=C:\Program Files

ProgramFiles(x86)=C:\Program Files (x86)

ProgramW6432=C:\Program Files

PROJ_LIB=C:\Program Files\Gdal_321\bin\proj7\SHARE

PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

【问题讨论】:

  • 为什么你有两倍的行“b.redirectInput(ProcessBuilder.Redirect.INHERIT);” ?
  • 一个是输入,一个是错误。
  • 简化您的命令。看看 gdalwarp.exe 是否在没有参数的情况下执行。然后一次添加一个参数,直到您看到哪个参数导致了问题。
  • 我试过了,在没有参数的情况下,在 cmd 终端 gdalwarp 会打印出帮助说明。在 processBuilder 中,流是空的,似乎 gdalwarp 没有执行。

标签: java windows processbuilder


【解决方案1】:

在调用p.waitFor() 之前尝试读取输出:

List<String> results = readOutput(process.getInputStream());

并可能将这些结果打印出来进行检查。

【讨论】:

  • 现在已经完成了,但是流仍然是空的:-(
【解决方案2】:

如果我添加工作目录,它就可以工作!

ProcessBuilder b = new java.lang.ProcessBuilder(cmd);
File f = new File("C:\\Program Files\\Gdal_321\\bin\\gdal\\apps");
b.directory(f);
Process p = b.start();

【讨论】:

  • 哦,太好了,真是个陷阱
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2020-07-25
  • 2021-12-27
  • 2022-06-10
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多