这是否复制了多模块项目中的Maven依赖项(即Spring)?

时间:2017-04-01 19:05:49

标签: java spring eclipse maven

这是简单的情况细分,我想知道我是否做得最好,或者是否有更好的约定。我创建了一个虚拟项目,仅用于学习目的。

我创建了一个多模块Maven项目。只是父POM,有两个兄弟孩子POMS,一个是服务层,另一个是网络层。

最终结果目标是在Web项目的目标文件夹中拥有一个功能完备的WAR,我可以将其部署到Tomcat中。

这是我不清楚的地方: - Service项目和Web项目都需要使用Spring。 Service项目需要使用Spring,因为它的依赖注入目的。我需要一个简单的Dog类,并将其自动注入DogService对象。这一切都很好。 - 然后我需要将DogService对象自动注入Dog控制器。 Dog控制器存在于多模块结构中的Web项目中。这也正常,因为我在Service项目的Web项目中声明了一个依赖项,因此所有Service JAR都包含在最终构建的WAR中,来自Web项目。

1)有没有办法简单地为两个子项目声明一个Spring依赖项,而不必在每个子POM.xml中声明依赖项?我只是想确保我没有重复资源。我相信这样做的方法就是在Parent POM.xml中声明依赖项。

2)如果我在^上面做#1,这是创建项目的最佳方式吗?从本质上讲,WEB模块是包含所有最终jar的模块,实质上它几乎就像在Tomcat中甚至不存在SERVICE项目一样。就Tomcat'知道'而言,其中包含一些包含类的JAR文件,其中一些已经在我的WEB模块中编写,其中一些已经在SERVICE模块中编写,所有这些都与生产/ Tomcat环境。对还是错?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

有没有办法简单地为两个子项目声明一个Spring依赖项,而不必在每个子POM.xml中声明依赖项?我只是想确保我没有重复资源。我相信这样做的方法就是在Parent POM.xml中声明依赖项。

Maven对依赖管理非常聪明,不会“复制”资源 - 它会缓存每个依赖项*并管理类路径,以便您使用的所有项目共享相同的jar。通常,在需要它们的模块中声明依赖关系;不要混淆模块或特别是父母的随机部分,以避免偶尔重新指定依赖。这就像在你的日常通勤中拖着你的拖车,因为你偶尔会去湖边。

请记住,依赖项是传递,因此,如果service-module依赖于spring-web(它确实存在,还是垃圾邮件依赖项?),那么{{1}它取决于web-module,它将引入依赖关系,而不必重复自己。

  

如果我在^上面做#1,这是创建项目的最佳方式吗?

不,不是。对你的依赖关系保持极简主义:如果你需要它,请包含它,但不要“防御性地”添加依赖关系。这将使您的部署膨胀并减慢构建速度,同时增加版本不匹配等问题的机会。

  

就Tomcat'知道'而言,其中包含一些包含类的JAR文件,其中一些已经在我的WEB模块中编写,其中一些已经在SERVICE模块中编写,所有这些都是与生产/ Tomcat环境无关。对还是错?

大多是假的。在战争中,您的顶级项目(service-module)直接在归档中包含其类,并且依赖项作为jar文件嵌入其中。但是,Tomcat 区分web-module和您的Spring以及其他依赖项。

更好的是使用Spring Boot的独立jar和嵌入式容器功能--Boot将负责将您需要的jar打包到一个不需要外部支持的可运行文件中。

*仅发布依赖项,但快照与此处无关。