【问题标题】:Maven - Building a single java/servlet based war file from multiple modulesMaven - 从多个模块构建一个基于 java/servlet 的 war 文件
【发布时间】:2012-03-23 23:46:48
【问题描述】:

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

模块 1

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

模块2

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)的混合,我不太确定什么是合适的工件。下图显示了我想要最终得到的战争文件的结构。

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 文件时提取它?
  • 即使只有一个有 web.xml 文件,我是否可以将每个模块的工件存储为 war 文件?

我如何使用 Maven 实现这一点

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

    MyApp.pom(父项目) 通用模块.pom 客户.pom 产品.pom

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

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

    |-productModule.v.0.1.zip

    |-customerModule.v.0.1.zip

    |-commonModule.v.0.1.zip

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

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

【问题讨论】:

    标签: java jsp servlets maven


    【解决方案1】:

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

      +-- 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文件)可以部署到适当的存储库,如果需要,它本身可以用作依赖项。

    你可以看看here作为例子。

    【讨论】:

    • 这和'Overlays'是一回事吗?
    • 没有。叠加层是一个完全不同的故事。在覆盖的情况下,您可以对不同的战争文件进行一种“合并”,看看这里:maven.apache.org/plugins/maven-war-plugin/overlays.html
    • 请记住 mod-1 和 mod-2 都将包含 jsp、html、css 文件。它们将如何包装? mod-1.jar 会包含来自 mod-1 模块的 jsp、css 文件吗?
    【解决方案2】:

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

    【讨论】:

    • 在 Tomcat 上使用 EAR 是行不通的 ;-) 手动合并它们的选项不是一个真正的选择,因为您将失去自动构建,它可以通过 Maven 解决。
    • 是的,它可以通过一些 Maven 战争技巧插件解决,但它并不真正符合 Java EE。在新的 Maven 项目中手动将 3 个战争的资源合并到一个战争中不会禁用任何 Maven 自动化。
    • 误会。我的意思是创造一场包含一切的单一战争……除此之外你是对的。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多