2017-04-20 56 views
8

比方说,我必须通过mywebapp.war部署一个很普通的Web应用程序,通过Maven产生:如何将JAR文件部署到现有的webapp子目录?

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

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

有没有办法打包存档捆绑在Maven中的两个或多个罐子其中,在webapps跌落时会得到不默认webapps/jardeploywebapps/mywebapp/jardeploy部署?这与我拿着罐子并将它们复制到该目录中的方式是一样的,但我希望遵循标准的应用服务器部署协议,方法是将生成的工件放在webapps中,而不是以前的方式。我实际上想要一个正式的工件(就像战争),而不是一个后期部署插件。有没有办法告诉(可能在清单中)如果该目录存在,它需要解压缩jar并将其放入该目录中?

容器不应该的问题,但它是Tomcat的7

+0

为什么你需要打包它们,如果他们不会被你的'mywebapp'使用?如果你在'mywebapp'中使用它们,那么为什么你需要将它们部署到不同的目录? – ayip

+0

它们确实用作从mywebapp启动的webstart。但是它们的构建过程与包含的Web应用程序完全不同。这是一款应用内的应用。 – amphibient

+0

它与您的网站上的永久下载链接类似,但由于版本控制,它们需要经常重建(而不是项目结构中的静态文件)。所以,你建立你的网络应用程序,然后构建可下载的工件(这是什么webstart本质上是+可运行的) – amphibient

回答

5

这看起来像一个标准的用例为Maven的战争插件和额外的资源,除非我失去了一些东西。 例如here(请参阅配置网络资源部分)告诉您可以在战争版本中包含额外资源(这是您的两个罐子对我来说是:额外的资源)

如果这不适用于您那么maven-assembly-plugin允许你指定一个更灵活的格式。

+0

我在考虑WAR,但是当我尝试它时,它需要一个包含web.xml的特定目录结构,没有。 – amphibient

+0

如果你没有web.xml,那么你已经超出了“标准”。因此,我认为程序集插件可以让你在这里获得最大的灵活性。 – Andrei

+0

你不能在那里放一个虚拟的web.xml吗?只是为了满足战争插件?我认为你可以从打包中排除web.xml文件本身。 – Andrei

1

您可以使用WebListener创建一个webapps,将jar文件复制到mywebapp/jardeploy目录中。所以当这个应用程序被部署在你的容器中时,它将把罐子复制到你想要的地方。

我测试过,它的工作原理!假设你已经创造了这个新的Web应用程序,并把罐子在的src/main/webapps /下罐目录,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。

相关问题