我正在开发一些Java应用程序,需要从bash运行一些外部程序。
我首选的实现方式是使用 ProcessBuilder
,但我有一些问题。
ProcessBuilder.environment()
返回 PATH=/usr/bin:/bin:/usr/sbin:/sbin
我猜这确实是系统路径。
但是有一个技巧,在我的 OSX 机器上,这些程序安装在 /usr/local/bin
下在其他机器上可以位于完全不同的位置。
我可以硬编码 environment.put()
符合我的路径,但这并不能解决我的跨平台问题。
最好的选择是如果可以的话copy-paste
bash PATH
如果这可能的话,如何实现?
您会采取哪种方法?
- 对最可能的路径进行硬编码并放入 ProcessBuilder
- 读取带有路径信息的文件(.profile、bash_profile、/etc/paths 等)
- 从 shell 复制粘贴 PATH - 如何? (如果可能的话,Win、Osx、Linux 解决方案)
- 其他?
TL;博士
我想从 ProcessBuilder 执行命令,该命令可以位于任何位置,并且我可以假设命令的路径位于 shell PATH env 中。 怎么办?
最佳答案
我会选择以下其中一项:
尝试从路径执行。如果失败,则向用户报告错误,指示该程序不在路径中(同时显示路径)。这样用户就会被引导配置他的路径,包括程序
搜索特定于您的程序的环境变量(例如,程序名称_BINPATH)。如果没有找到,告诉用户他必须定义它。该变量应指向包含二进制文件的目录
尝试执行二进制文件。如果失败,则加载配置文件(如果存在),该文件指定它们的位置。如果加载配置文件失败,请在文件系统中搜索二进制文件(向用户报告您正在做什么,并且只会执行一次),一旦找到,请将其位置存储在配置文件中。
关于Java和系统环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056801/