【问题标题】:Is a Maven multi-module project appropriate for independent programs?Maven 多模块项目是否适合独立程序?
【发布时间】:2016-02-15 05:23:52
【问题描述】:

我刚刚开始从事一个项目,该项目在不同程序之间的代码库中有很多相似之处。例如,有四个程序正在解析 HTML 页面,每个程序都有一个带有 Parser 类的 util 包(所有这些都相同)。我的想法是将所有这些独立的程序组合成这样的结构:

- util (util related classes)
    - src
    - pom.xml
- net (network related classes)
    - src
    - pom.xml
- app1
    - src
    - pom.xml
- app2
    - src
    - pom.xml
- app3
    - src
    - pom.xml
- pom.xml

然后,当我需要在任何应用程序中使用 Redis 时,我只需导入 net.Reis 包(或导入 util.Parser 以使用 HTML 解析器)。但是,我对事物很陌生,即使在阅读了多模块指南 here 之后,我仍然不确定这是否适合完全不同(但在许多方面相关)程序的模型。

【问题讨论】:

    标签: java maven multi-module


    【解决方案1】:

    我认为你是完全正确的。出于显而易见的原因,重用模块比重复代码要好得多。

    但是我想强调的是,有一个编译类路径和一个运行时类路径。我会解释的。

    构建

    在 Maven 中有一个 packaging 属性。它决定了从模块中编译出的工件类型。通常(默认情况下)它是一个 jar

    因此,当您构建时,您会得到一个 Parser 罐子,并将其作为依赖项添加到其他模块的 pom.xml 文件中。

    现在这仅意味着在编译期间解析器二进制文件将位于类路径中(换句话说,如果您有依赖于模块 Parser 的模块 A,则在模块 A 的源代码中,您将能够使用定义的类 MyParser在模块解析器中)。

    这就是你的构建方式。

    运行时

    一旦 jar 准备就绪,您就不能将其作为独立应用程序运行。 Maven 不会开箱即用地处理它。

    运行时类路径是完全不同的东西。

    因此,您必须决定如何实际运行应用程序。

    这里有很多可能的选择:

    • 将所有二进制文件重新打包到一个大的胖罐(超级罐)中。 Maven 阴影插件可以在这里提供帮助

    • 创建自定义布局和脚本以运行应用程序。在这种情况下,请查看 maven-assembly-plugin

    • 对于 web 应用程序,只需创建一个 WAR 模块(每个应用程序一个,war 代表“web 存档”)并将所有内容打包到 web-inf/lib 中。如果您指定包装“war”,Maven 会自动执行此操作。但是在这种情况下,您需要一个容器来运行战争(Tomcat、Jetty 等)。

    • 同样,如果它应该是一个 Web 应用程序,请考虑使用更多“花哨”的东西,例如 Spring Boot。这将创建一个大罐子,其中包含您需要的所有内容,因此您根本不需要考虑类路径。

    我肯定在这里和那里错过了几个方法,选择是你的。

    【讨论】:

      【解决方案2】:

      Maven 多模块项目不是这种情况的正确解决方案。

      将功能分解为单独项目的基本思想是正确的。但是为了实现这一点,没有必要将项目组织成多模块 maven 项目。单独的独立 Maven 项目会做得很好。

      如果所有这些项目要共享相同的生命周期,即发布和版本相同,那么多模块 maven 项目将是相关的。所以问题是,当app3 发布时,app1 是否也会发布?如果app2的版本发生变化,net项目的版本是否也要变化?只有当答案是肯定的时候,项目才会被组织成 maven 多模块项目。

      【讨论】:

        猜你喜欢
        • 2019-03-17
        • 2016-05-20
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2021-03-23
        • 2018-11-28
        相关资源
        最近更新 更多