Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从war访问.sh文件的目录结构_Java - Fatal编程技术网

Java 从war访问.sh文件的目录结构

Java 从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

我有一个.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导入脚本

  • 您将无法直接从.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中,使用
      getResourceAsStream()
      读取它,将它写入tmp目录,使其可执行,并按照Brian的建议执行
      exec()
      it
    在我看来,最后一个选项是(唯一的)方法,可以这样实现(假设脚本与类位于同一个包中,即
    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);