Java 从war访问.sh文件的目录结构
我有一个.sh文件,我正在创建一个war文件,其中类位于web inf/classes/test/test.class下 字符串cmd=“./test.sh” 运行时apiJava 从war访问.sh文件的目录结构,java,Java,我有一个.sh文件,我正在创建一个war文件,其中类位于web inf/classes/test/test.class下 字符串cmd=“./test.sh” 运行时api 如果将此文件放在web inf/classes下,我将无法访问它。我想知道在war中将.s文件放在哪里才能访问test.class as./test.sh的路径?我将通过读取.sh 然后您有两个选择: 将其写入目录(可能是/tmp?),更改权限,然后从那里执行 (稍微复杂一点)。通过执行/bin/bash,然后通过stdin
如果将此文件放在web inf/classes下,我将无法访问它。我想知道在war中将.s文件放在哪里才能访问test.class as./test.sh的路径?我将通过读取
.sh
然后您有两个选择:
/tmp
?),更改权限,然后从那里执行李>
/bin/bash
,然后通过stdin导入脚本您将无法直接从.war结构执行脚本。根据您在另一个问题中的评论,您正在使用以下代码调用脚本:
Process p = Runtime.getRuntime().exec(cmd);
正如javadoc中所解释的,这相当于调用(command,null,null)
,其行为方式与调用(cmdarray,envp,dir)
完全相同。现在,如果我们查看(String[]cmdarray,String[]envp,File dir)
的javadoc,我们可以看到:
新子流程的工作目录由dir
指定。如果dir
为null
,则子流程将继承当前流程的当前工作目录
换句话说,在您的情况下,脚本test.sh
应该位于应用程序服务器的工作目录中,即文件系统中调用java
命令的位置(当然不是WEB-INF/classes
)。此目录是在user.dir
系统属性中设置的,您可以阅读如下内容:
String cwd = System.getProperty("user.dir")
还要注意的是,您不能。实际上,从理论上讲,您应该编写代码,使其不依赖于当前工作目录的可移植性(即使在您的情况下这并不重要,因为使用Runtime
API会使代码实际上不可移植)
总而言之,您有几个选择(没有一个像我说的那样是真正可移植的,但最后一个是“不那么糟糕”):
- 将
脚本放在应用服务器的工作目录中hello.sh
- 将它放在其他地方,并相对于工作目录指向它(
)/path/to/hello.sh
- 把它放在其他地方,用绝对路径指向它(
)/path/to/hello.sh
- 将其放置在其他位置,并在调用
时使用exec()
参数dir
- 将它放入WAR中,使用
读取它,将它写入tmp目录,使其可执行,并按照Brian的建议执行getResourceAsStream()
itexec()
WEB-INF/classes/test/hello.sh
):
我不是有意粗鲁,但是,真的,你应该:1。花些时间格式化你的问题,使用适当的大写和标点符号2。不要发布X时间相同的问题(见)3。学习如何提出“聪明的问题”4。阅读常见问题。如何使sh文件在java代码中可执行?tempFile.setExecutable(true);不起作用,这很奇怪,我不知道还有别的办法。文件的权限是什么?
InputStream is = this.getClass().getResourceAsStream("hello.sh");
String[] cmd = null;
File tempFile = null;
tempFile = File.createTempFile("hello", "sh");
// extract the embedded hello.sh file from the war and save it to above file
OutputStream os = new FileOutputStream(tempFile);
byte[] buffer = new byte[1024];
int bytes;
while( (bytes = is.read(buffer)) != -1) {
os.write(buffer, 0, bytes);
}
os.close();
tempFile.setExecutable(true);
cmd = new String[] { tempFile.getAbsolutePath() };
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmd);