我有一个 JAR 打包的独立应用程序,它在执行时会将自身解压缩到一个临时目录中并在该目录中生成一个子进程。一些第三方代码和配置的原因是假设数据文件是相对于当前工作目录找到的,而 java 没有 chdir() 方法,所以唯一的方法是为子进程切换工作目录。
一切正常,除了系统属性。操作员可能会决定在命令行中指定一些系统属性,包括标准属性和与第三方配置相关的属性:
java -Djava.io.tmpdir=/temp -Dsomething=else -jar foo.jar (parameters)
默认情况下,父 java 进程可用的系统属性不会传播给子进程。我应该自己做。在这里我遇到了一个障碍:我无法分辨哪些属性是由操作员设置的,哪些是由 JVM 默认初始化的。
拿那个 java.io.tmpdir 一个。如果运营商提供了它,他有充分的理由这样做(也许默认位置是“磁盘已满”)。我必须将其设置为子进程,否则它将失败。但是我怎么知道它是否来自运营商?它可能只是默认值。
我可以尝试将所有可用的系统属性设置为子进程。虽然它需要很长的列表,更糟糕的是,在命令行长度有限的某些环境中会失败。
到目前为止,我发现的唯一解决方法(非常邪恶的)是首先生成另一个子进程,根本没有任何参数,然后让它通过管道将它拥有的所有系统属性返回给父进程。与父级匹配的值是默认值。其余的应该传递给工作子进程。
有没有人有更好的选择?