如何将JAR文件部署到现有的webapp子目录?

时间:2017-04-20 20:11:15

标签: java maven jar

假设我有mywebapp.war生成的Maven部署的非常普通的网络应用:

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

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

有没有办法打包捆绑存储在Maven中的两个或更多个jar的存档,当放入webapps时,它将部署在默认webapps/jardeploy而不是webapps/mywebapp/jardeploy?这就像我拿着罐子并将它们复制到那个目录中一样,但是我想通过在webapps中删除生成的工件而不是hacky以前的方法来遵循标准的app服务器部署协议。我实际上想要一个正式的工件(就像战争一样)而不是一个post deploy附加组件。有没有办法告诉(可能在清单中)它需要解压缩jar并将其放在该目录中,如果该目录存在?

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

2 个答案:

答案 0 :(得分:5)

这看起来像maven-war-plugin和额外资源的标准用例,除非我遗漏了一些东西。 例如here(请参阅配置网络资源一节)告诉您,您可以在战争版本中包含其他资源(这就是您的两个罐子对我来说:额外的资源)

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

答案 1 :(得分:1)

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

我测试了它的确有效!假设您已经创建了这个新的webapp并将jar放在 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 archetypes创建了这个新的webapp。