假设我有mywebapp.war
生成的Maven
部署的非常普通的网络应用:
webapps
|
|--mywebapp.war
|--mywebapp
|
|--images
|--js
|--jsp
|--jardeploy
|--META-INF
|--styles
|--WEB-INF
现在我想在myjarfile1.jar
中部署myjarfile2.jar
和webapps/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。
答案 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。