【发布时间】: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