从war获取.sh文件的目录结构

时间:2009-12-12 12:08:08

标签: java

我有一个.sh文件我正在创建一个war文件,这些类在web-inf / classes / test / test.class下。我正在使用以下语法从测试类访问.sh文件 string cmd =“./ test.sh” 运行时api

如果我将它放在web-inf / classes下,我无法访问此文件。我想知道在哪里可以将.s文件置于war中以访问test.class中的路径为./test.sh?

2 个答案:

答案 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指定。如果dirnull,则子进程将继承当前进程的当前工作目录。

换句话说,在您的情况下,您的脚本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参数。
  • 将其放入WAR并使用exec()读取,将其写入tmp目录,使其可执行,并按照Brian 的建议getResourceAsStream()

在我看来,最后一个选项是(唯一的)方式,可以这样实现(假设脚本与您的类在同一个包中,即exec()):

WEB-INF/classes/test/hello.sh

答案 1 :(得分:0)

我会通过ClassLoader.getResourceAsStream()阅读.sh

然后你有两个选择:

  1. 将其写入目录(可能是/tmp?),更改权限,然后从那里执行。
  2. (多一点参与)。通过Runtime.exec()执行/bin/bash,然后通过stdin传输脚本。
  3. 您将无法从.war结构直接执行脚本