【问题标题】:How to deploy JAR files to existing webapp subdirectory?如何将 JAR 文件部署到现有的 webapp 子目录?
【发布时间】:2017-09-17 15:31:38
【问题描述】:

假设我有一个通过mywebapp.war 部署的非常普通的网络应用程序,由Maven 生成:

webapps
  |
  |--mywebapp.war
  |--mywebapp
       |
       |--images
       |--js
       |--jsp
       |--jardeploy
       |--META-INF
       |--styles
       |--WEB-INF

现在我想在webapps/mywebapp/jardeploy 中部署myjarfile1.jarmyjarfile2.jar(或更多)。它们是另一个 Maven 项目的产物,而不是制造战争的那个。它们也不是 mywebapp 使用的 jar,它位于 WEB-INF/lib 下,而是单独构建的可下载 jar,而不是 mywebapp 源代码的一部分。

有没有办法在 Maven 中打包一个打包两个或多个 jar 的档案,当放入 webapps 时,将不会在默认 webapps/jardeploy 中部署,而是在 webapps/mywebapp/jardeploy 中部署?这与我将 jar 包复制到该目录中是一样的,但我想遵循标准的应用程序服务器部署协议,将生成的工件放在 webapps 中,而不是以前的 hacky 方法。我实际上想要一个正式的工件(就像战争一样)而不是部署后的附加组件。有没有办法告诉(可能在清单中)它需要解压 jar 并将其放入该目录(如果该目录存在)?

容器无关紧要,但它是 Tomcat 7。

【问题讨论】:

  • 如果您的mywebapp 不使用它们,为什么还要打包它们?如果您确实在 mywebapp 中使用它们,那么为什么需要将它们部署到不同的目录?
  • 它们确实被用作从 mywebapp 启动的 webstart。但是它们的构建过程与包含的 Web 应用程序完全不同。它是应用中的应用。
  • 这类似于例如,如果 jars 是您网站上的永久下载链接,但由于版本控制,它们需要经常重建(而不是项目结构中的静态文件)。因此,您构建您的网络应用程序,然后构建可下载的工件(这就是 webstart 本质上是 + 可运行的)
  • 如果我理解正确,您想将这 2 个 maven 依赖项下载到与其他文件夹不同的文件夹中吗?
  • 我不想下载它们。用户这样做。与WEB-INF/lib 不同,我需要将它们部署到可供下载的目录。但是它们需要在部署容器应用程序之后进行部署。将其视为对现有已部署应用程序的修正。

标签: java maven jar


【解决方案1】:

这看起来像是 maven-war-plugin 和额外资源的标准用例,除非我遗漏了什么。 例如here(参见配置 web 资源部分)告诉你可以在你的战争构建中包含额外的资源(这就是你的两个 jar 对我来说:额外的资源)

如果这对您不起作用,那么 maven-assembly-plugin 允许您指定更灵活的格式。

【讨论】:

  • 我在考虑 WAR,但是当我尝试它时,它需要一个包含 web.xml 的特定目录结构,而我没有。
  • 如果你没有 web.xml 那么你已经超出了“标准”。因此,我认为汇编插件将在这里为您提供最大的灵活性。
  • 你不能在里面放一个虚拟的 web.xml 吗?只是为了满足战争插件?我认为您可以将 web.xml 文件本身从打包中排除。
  • 好的——我会试试然后回来。谢谢
  • 当然。另外,maven-resources-plugin 也可以很方便的复制文件;但如果您的设置变得更复杂,使用程序集插件会更容易。
【解决方案2】:

您可以使用 WebListener 创建一个 webapp,将 jar 文件复制到 mywebapp/jardeploy 目录。因此,当此应用程序部署在您的容器中时,它会将 jar 复制到您想要的位置。

我测试过,它有效!假设您已经创建了这个新的 webapp 并将 jars 放在 src/main/webapps/jars 目录中,WebListener 看起来像这样:

@WebListener
public class Deployer implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        String realPath = sce.getServletContext().getRealPath("/jars");
        try {
            Files.copy(new File(realPath + "/myjarfile1.jar").toPath(), 
                new File(System.getProperty("catalina.base")+"/webapps/mywebapp/jardeploy/myjarfile1.jar").toPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("On shutdown web app");
    }
}

此代码只是一个概念证明,可以进行增强,但它服务于它的目的。它只将一个 jar (myjarfile1.jar) 复制到 /webapps/mywebapp/jardeploy。 PS:我使用 maven 原型创建了这个新的 webapp。

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多