我刚刚开始研究一个在不同程序之间的代码库中有很多相似之处的项目。例如,其中四个程序正在解析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之后,我仍然不确定这是否适合完全不同(但在很多方面相关)的程序。< / p>
答案 0 :(得分:1)
我认为你完全正确。由于显而易见的原因,重用模块比代码重复要好得多。
但是我想强调一下编译类路径和运行时类路径。我会解释......
<强>构建强>
在maven中有一个打包属性。它确定将从模块中编译的工件类型。 通常(默认情况下)它是 jar 。
建立你的底线时,我会得到一罐Parser,并将其作为依赖项添加到其他模块的pom.xml文件中。
现在这只意味着在编译期间,解析器二进制文件将在类路径中(换句话说,如果你有依赖于模块Parser的模块A,在模块A的源代码中你将能够使用类MyParser在模块Parser中定义。
你是如何建立的。
<强>运行强>
一旦jar准备就绪,您就无法像独立应用程序一样运行它。 Maven没有开箱即用。
运行时类路径是一个完全不同的东西
因此,您必须决定如何实际运行该应用程序。
这里有很多可能的选择:
将所有二进制文件重新包装成一个大胖罐(超级罐)。 Maven shade插件可以在这里提供帮助
创建用于运行应用程序的自定义布局和脚本。在这种情况下,请查看maven-assembly-plugin
对于wwb应用程序。只需创建一个WAR模块(每个应用程序一个,war代表&#34; web存档&#34;)并将所有内容打包到战争中的web-inf / lib中。如果您指定包装&#34; war&#34;,Maven会自动执行此操作。但是在这种情况下,您需要一个容器来运行战争(Tomcat,Jetty等)。
同样,如果它应该是web应用程序,请考虑使用更多&#34; fancy&#34;像Spring Boot这样的东西。这将创建一个大胖罐,里面有你需要的一切,所以你根本不需要考虑类路径。
我肯定在这里和那里错过了几种方法,当然是你的选择。
希望这有帮助
答案 1 :(得分:0)
Maven多模块项目不是此方案的正确解决方案。
将功能分解为单独的项目的基本思想是正确的。但是,为了实现此目的,不必将项目组织为多模块Maven项目。单独的独立Maven项目会做的很好。
如果所有这些项目都共享相同的生命周期,即所有版本和版本都相同,则多模块Maven项目将是相关的。所以问题是,当app3
即将发布时,app1
也将被发布吗?如果app2
的版本发生变化,net
项目的版本也会发生变化吗?仅当答案为是时,项目才应组织为Maven多模块项目。