Maven - 从多个模块构建一个基于java / servlet的war文件

时间:2012-03-06 13:34:18

标签: java jsp servlets maven

上周我发布了一个关于如何构建依赖模块的问题,结果是我建议使用像Maven或Ivy这样的构建工具。我决定使用Maven来尝试实现我想做的事情。我的项目基本上构建了一个部署到Tomcat的war文件。模块本身是最终war文件的一部分。这是模块的示例结构

第1单元

customerModule
    |-webapp
        |-jsp
            |-customer
                |-findCustomer.jsp
                |-addNewCustomer.jsp
                |-deleteCustomer.jsp
    |-src
        |-com
            |-mycompany
                |-customer
                    |-FindCustomerAction.java
                    |-AddCustomerAction.java
                    |-DeleteCustomer.java

单词数

productModule
    |-webapp
        |-jsp
            |-product
                |-productCustomer.jsp
                |-addNewProduct.jsp
                |-deleteProduct.jsp
    |-src
        |-com
            |-mycompany
                |-product               
                    |-FindProductAction.java
                    |-AddProductAction.java
                    |-DeleteProduct.java            

模块3

commonModule
    |-webapp
        |-css
            |-style.css
        |-jsp
            |-templates
                |-coreTemplate.jsp
    |-src
        com
            |-mycomany
                |-common
                    |-Logger.java
                    |-Access.java
    |-META-INF
        |-MANIFEST.MF
        |-context.xml
    |-WEB-INF
        |-lib
            |-oraclejdbc.lib
            |-log4j.lib
            |-common.lib
        |-struts-config.xml
        |-tiles-def.xml
        |-web.xml

正如您可能看到的,上述内容将共同形成一个应用程序。我想做的是为每个模块最终得到一个工件。由于文件类型(jsp,css,java)的混合,我不太确定什么是合适的工件。下图显示了我想最终得到的war文件的结构。

MyApp.war
    |-webapp
        |-css
            |-style.css
        |-jsp
            |-customer
                |-findCustomer.jsp
                |-addNewCustomer.jsp
                |-deleteCustomer.jsp
            |-product
                |-productCustomer.jsp
                |-addNewProduct.jsp
                |-deleteProduct.jsp     
            |-templates
                |-coreTemplate.jsp
    |-META-INF
        |-MANIFEST.MF
        |-context.xml
    |-WEB-INF
        |-lib
            |-oraclejdbc.lib
            |-log4j.lib
            |-common.lib
            |-customerModule.jar
            |-productModule.jar
        |-classes
            |-com
                |-mycomany
                    |-common
                        |-Logger.class
                        |-Access.class
        |-struts-config.xml
        |-tiles-def.xml
        |-web.xml   

一些笔记      - commonModule中的java文件是在WEB-INF / classes中构建的      - customerModule的java文件最终作为WEB-INF / lib中的jar文件      - productModule的java文件最终作为WEB-INF / lib中的jar文件      - 所有jsps,css最终都在war文件的根目录中

我应该为存储库中的每个模块存储工件的最佳方法是什么?

  • 我可以使用jar文件但是这个不能保存html类型文件(jsp,css,js等)
  • 每个模块(commonModule除外)都包含一个jar文件+ jsp,css文件。我正在考虑将构建的工件存储为zip文件,并在构建MyApp.war以构建war文件时将其解压缩?
  • 我可以将每个模块的工件存储为war文件,即使只有一个有web.xml文件吗?

如何使用Maven实现此功能

  • 我一直在调查Maven,发现可能有一个具有以下结构的多模块项目

    MyApp.pom(父项目)     commonModule.pom     customer.pom     product.pom

  • 如果我压缩了存储库中的模块,我将如何从父项目中引用它们并解压缩它们以构建最终的war文件?

  • 如果构建了任何子项目,是否可以自动触发父项目的构建?
  • 我还没弄明白如何维护每个子项目的版本。如果我构建客户项目,那么父项目如何知道存储库中有更新版本的customer.zip(或.jar)?
  • 假设存储库当前包含以下内容

    |-productModule.v.0.1.zip

    |-customerModule.v.0.1.zip

    |-commonModule.v.0.1.zip

如果我重建,clientModule然后重建war文件购买构建父项目,maven是否重建了存储库中的所有其他模块,即使它们没有更改?这究竟是如何运作的?

是否有任何示例项目可以演示如何实现上述目标?显示上述示例的任何链接或资源都非常有用。

2 个答案:

答案 0 :(得分:1)

老实说,在你的情况下做的最好的事情就是制作一个包含每场战争的.ear文件。否则,如果你真的希望将所有3场战争中的资源整合到一场战争中,你应该手动合并它们。 Java EE没有任何关于合并这样的战争的规范,所以即使你设法用一些Maven插件/ workAround来做它也不会是kusher。

答案 1 :(得分:1)

首先,您的结构看起来不对,导致war项目的默认文件夹布局如下:

  +-- pom.xml (war packaging)
  +-- src/main/java (java Sources)
  +-- src/main/webapp (jsp pages etc.)
  +-- src/main/resources (language bundles etc.)

此外,如果您希望最终将所有模块放入同一个war文件中,但您希望将这些模块分开。最好的方法是创建一个多模块构建,如下所示:

  root
  +-- pom.xml (parent of all)
  +-- mod-war (incl. pom.xml)
  +-- mod-1 (incl. pom.xml)
  +-- mod-2 (incl. pom.xml)

并在mod-war pom中对mod-1和mod-2进行依赖。这将导致将它们打包成单个war文件,其中包含单独的mod-1-VERSION.jar等。此工件(war文件)可以部署到适当的存储库,如果需要,它本身可以用作依赖项。 / p>

您可以查看here作为示例。