为什么我不能让我的 Windows 10 计算机执行 Java ProcessBuilder?



我在用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终端中执行gdalwarr.exe时相同。processBuilder似乎没有执行gdalwarp。我得到的退出代码是-103741511,应该是0或-1。errorStream是空的,我没有打印出来。

当我执行C:Program FilesGdalbingdalappsgdalwarp.exe -t_srs EPSG:32633 -et 1 -r near H:GeoDataRaster1M_WEF30JAN2020_WGS84LL_somlos_8.tif H:GeoDataRasterresult.tif在cmd终端中,我得到了有意义的输出和结果文件:H:\GeoData\Raster\result.tif.

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

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

-更新----

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

Command: C:Program FilesGdal_321bingdalappsgdalwarp.exe, -t_srs, EPSG:32633, -et, 1, -r, near, C:Temp1M_WEF30JAN2020_WGS84LL_somlos_8_overview.tif, C:Temp1M_WEF30JAN2020_8_overview.tif

C:Program FilesGdal_321bingdalappsgdalwarp.exe is exacutable

Exit value:-1073741511

过程环境变量的选择:

PROCESSOR_LEVEL, 6

JAVA_HOME, C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjre

POSTGIS_GDAL_ENABLED_DRIVERS, GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid

GDAL_DATA, C:Program FilesGdal_321bingdal-data

GDAL_DRIVER_PATH, C:Program FilesGdal_321bingdalplugins;C:Program FilesGdal_321bingdalplugins-external

PROCESSOR_ARCHITECTURE, AMD64

PSModulePath, C:Program FilesWindowsPowerShellModules;C:WINDOWSsystem32WindowsPowerShellv1.0Modules

SystemDrive, C:

POSTGIS_ENABLE_OUTDB_RASTERS, 1

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

CommonProgramFiles, C:Program FilesCommon 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:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:WINDOWSSystem32OpenSSH;C:Program FilesPythonPython39;C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjrebin;C:Program FilesGdal_321bin;C:Program FilesGdal_321bingdalpythonosgeo;C:Program FilesGdal_321binproj6apps;C:Program FilesGdal_321bingdalapps;C:Program FilesGdal_321binmsapps;C:Program FilesGdal_321bingdalcsharp;C:Program FilesGdal_321bincurl;C:UsersanpaumalAppDataLocalMicrosoftWindowsApps;C:Program Fileseclipse;

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

DriverData, C:WindowsSystem32DriversDriverData

OS, Windows_NT

PROJ_LIB, C:Program FilesGdal_321binproj7SHARE

PROCESSOR_REVISION, 9e0d

CommonProgramW6432, C:Program FilesCommon 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 FilesCommon Files

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

CommonProgramW6432=C:Program FilesCommon Files

DriverData=C:WindowsSystem32DriversDriverData

GDAL_DATA=C:Program FilesGdal_321bingdal-data

GDAL_DRIVER_PATH=C:Program FilesGdal_321bingdalplugins;C:Program FilesGdal_321bingdalplugins-external;

JAVA_HOME=C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjre

NUMBER_OF_PROCESSORS=12

OS=Windows_NT

Path=C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:WINDOWSSystem32OpenSSH;C:Program FilesPythonPython39;C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjrebin;C:Program FilesGdal_321bin;C:Program FilesGdal_321bingdalpythonosgeo;C:Program FilesGdal_321binproj6apps;C:Program FilesGdal_321bingdalapps;C:Program FilesGdal_321binmsapps;C:Program FilesGdal_321bingdalcsharp;C:Program FilesGdal_321bincurl;C:UsersanpaumalAppDataLocalMicrosoftWindowsApps;

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 FilesGdal_321binproj7SHARE

PSModulePath=C:Program FilesWindowsPowerShellModules;C:WINDOWSsystem32WindowsPowerShellv1.0Modules

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

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

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

如果我添加工作方向,它就可以工作!

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();

相关内容

最新更新