Java和系统环境变量

标签 java bash shell processbuilder

我正在开发一些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 中。 怎么办?

最佳答案

我会选择以下其中一项:

  1. 尝试从路径执行。如果失败,则向用户报告错误,指示该程序不在路径中(同时显示路径)。这样用户就会被引导配置他的路径,包括程序

  2. 搜索特定于您的程序的环境变量(例如,程序名称_BINPATH)。如果没有找到,告诉用户他必须定义它。该变量应指向包含二进制文件的目录

  3. 尝试执行二进制文件。如果失败,则加载配置文件(如果存在),该文件指定它们的位置。如果加载配置文件失败,请在文件系统中搜索二进制文件(向用户报告您正在做什么,并且只会执行一次),一旦找到,请将其位置存储在配置文件中。

关于Java和系统环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056801/

相关文章:

java数据访问: is this good style of java data access code,还是尝试太多了?

regex - 如何使用 sed 忽略但保留 ANSI 转义码?

bash - 使用 bash 将单行输入传递给命令的标准输入的最佳实践

c - 使用 C 语言的终端控制代码

java - 在页面中集成 java applet

java - 将 org.w3c.dom.Document 漂亮地打印到标准输出的最短方法是什么?

linux - "sort filename | uniq"不适用于大文件

android - 在 Android 终端中运行 Python

java - 了解 Java 中的对象分配

linux - 带有否定条件的 if 语句