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

zig*_*ggy 5 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
Run Code Online (Sandbox Code Playgroud)

单词数

productModule
    |-webapp
        |-jsp
            |-product
                |-productCustomer.jsp
                |-addNewProduct.jsp
                |-deleteProduct.jsp
    |-src
        |-com
            |-mycompany
                |-product               
                    |-FindProductAction.java
                    |-AddProductAction.java
                    |-DeleteProduct.java            
Run Code Online (Sandbox Code Playgroud)

单词数

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
Run Code Online (Sandbox Code Playgroud)

正如您可能看到的,上述内容将共同形成一个应用程序.我想做的是为每个模块最终得到一个工件.由于文件类型(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   
Run Code Online (Sandbox Code Playgroud)

几个注意事项 - 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

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

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

khm*_*ise 1

首先,您的结构看起来错误,因为 war 项目的默认文件夹布局如下所示:

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

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

  root
  +-- pom.xml (parent of all)
  +-- mod-war (incl. pom.xml)
  +-- mod-1 (incl. pom.xml)
  +-- mod-2 (incl. pom.xml)
Run Code Online (Sandbox Code Playgroud)

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

您可以看一下这里作为示例。