我有一个.sh文件我正在创建一个war文件,这些类在web-inf / classes / test / test.class下。我正在使用以下语法从测试类访问.sh文件 string cmd =“./ test.sh” 运行时api
如果我将它放在web-inf / classes下,我无法访问此文件。我想知道在哪里可以将.s文件置于war中以访问test.class中的路径为./test.sh?
答案 0 :(得分:1)
根据您在其他问题中的评论,您使用以下代码来调用您的脚本:
Process p = Runtime.getRuntime().exec(cmd);
如javadoc中所述,这相当于exec
(command, null, null)
的调用,的行为方式与调用exec
(cmdarray, envp, dir)
<完全相同/ em>的。现在,如果我们查看exec
(String[] cmdarray, String[] envp, File dir)
的javadoc,我们可以阅读:
新子进程的工作目录由
dir
指定。如果dir
为null
,则子进程将继承当前进程的当前工作目录。
换句话说,在您的情况下,您的脚本test.sh
应位于应用程序服务器的工作目录中,即文件系统中{的位置{调用了{1}}命令(当然不是java
)。此目录在WEB-INF/classes
系统属性中设置,您可以按如下方式阅读:
user.dir
另请注意,不能 change the working directory。实际上,理论上你应该编写你的代码,因此它不依赖于当前工作目录的可移植性(即使这在你的情况下并不重要,因为使用String cwd = System.getProperty("user.dir")
API会使你的代码无法真正移植)。
总结一下,你有几个选择(没有一个像我说的那样真正可移植,但最后一个是“更糟糕”):
Runtime
脚本放在应用服务器的工作目录中。hello.sh
)。./path/to/hello.sh
)指向它。/path/to/hello.sh
时使用dir
参数。exec()
读取,将其写入tmp目录,使其可执行,并按照Brian 的建议getResourceAsStream()
。在我看来,最后一个选项是(唯一的)方式,可以这样实现(假设脚本与您的类在同一个包中,即exec()
):
WEB-INF/classes/test/hello.sh
答案 1 :(得分:0)
我会通过ClassLoader.getResourceAsStream()阅读.sh
。
然后你有两个选择:
/tmp
?),更改权限,然后从那里执行。 /bin/bash
,然后通过stdin传输脚本。您将无法从.war结构直接执行脚本。