【问题标题】:Updating Tomcat WAR file on Windows在 Windows 上更新 Tomcat WAR 文件
【发布时间】:2020-04-07 21:49:39
【问题描述】:

我继承了一个本地托管在不同机器上的 Maven/Tomcat(8.5) Web 应用程序。我试图让应用程序从本地存储(在 USB 驱动器上)或从 Windows 上的 AWS 下载的战争文件更可靠地更新。在 Linux 版本上,该软件可以通过 curl 使用 manager-script 上传新的 war 文件,具体操作如下:

        String url = "http://admin:secret@localhost:8080/manager/text/deploy?path=/foo&update=true";
        CommandRunner.executeCommand(new String[] { "curl", "--upload-file", war, url });

对于 Windows,当前方法尝试复制 /webapps 目录中的 war 文件,并在重启 tomcat 或主机后让 tomcat 自动部署新的 war 文件。问题是复制的战争文件最终是 0kb 并且没有什么可部署的。这似乎发生在我的安装功能之外,因为/webapps/foo.warFileUtils.copyFile() 之后的文件大小是正确的大小。

我已尝试通过阅读 Tomcat 管理器文档和另一篇文章来实现对 manager-script 卷的 PUT 请求:

    File warfile = new File(request.getWar());
    String warpath = warfile.getAbsolutePath().replace("\\", "/");

    //closes other threads
    App.terminate();

    String url = "http://admin:secret@localhost:8080/manager/text/deploy?path=/foo&war=file:" + warpath + "&update=true";
    HttpClient client = HttpClientBuilder.create().build();
    HttpPut request;
    try {
            request = new HttpPut(url);

            HttpResponse response = client.execute(request);
            BufferedReader rd = new BufferedReader(
                            new InputStreamReader(response.getEntity().getContent()));

            StringBuffer result = new StringBuffer();
            String line = "";
            while ((line = rd.readLine()) != null) {
                    result.append(line);
            }

            System.err.println(result.toString());
        } catch (Exception e){
            LOGGER.info("war install failed");
            throw new ServiceException("Unable to upload war file.", e);
        }

然而,这个过程仍然以一个 0kb 的战争文件结束/webapps。我的日志中唯一的错误是当 tomcat 尝试部署空战时。我曾尝试在我的 tomcat 安装中放宽文件读/写权限,但似乎没有帮助。我也不知道如果我尝试该实现,是否可以保证所有 Windows 安装都可以访问 curl。有没有人遇到过类似的问题?感谢您的帮助!

【问题讨论】:

  • 更新:所以我无法让它工作。我还没有弄清楚我无法复制的 curl 做什么。我能够深入研究公司记录并确定我安装的所有 Windows 机器都超过了 1803 版,其中 curl 在 Windows 中是标准配置。我使用 Java Runtime 来执行上面的 curl 命令。因此,如果有人在这里绊倒,我建议先尝试一下。

标签: windows maven deployment war tomcat8.5


【解决方案1】:

Will,您确实打开了文件,但您没有向其中写入任何内容,结果字符串被写入标准输出,因此您必须替换 System.err.println(result.toString());与 fr = new FileWriter(file); br = new BufferedWriter(fr); br.写(结果); 并且不要忘记在最后关闭您的资源 (br.close(); fr.close(); ) :) PS:检查是否有一些信息需要过滤(标题或人员之类的)

【讨论】:

  • 我以为结果只是对put请求的响应吧?文件覆盖和部署应该由tomcat manager-script根据put请求来处理。无论如何,我尝试了您的建议,但没有成功。我也尝试将 war 文件作为 FileEntity 添加到 put 请求中,但遇到了套接字写入错误。
猜你喜欢
  • 2010-09-13
  • 2012-07-29
  • 2016-07-02
  • 1970-01-01
  • 2015-03-19
  • 2015-09-03
  • 2013-08-21
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多