2017-04-01 32 views
2

这里是简单的情况分解,我想知道如果我做这个最佳或如果有更好的约定。我为了学习目的创建了一个虚拟项目。这是否复制了多模块项目(即Spring)中的Maven依赖项?

我创建了一个多模块Maven项目。简单地说,父母POM与两个同胞孩子POMS,一个是服务层,另一个是网络层。

最终结果目标是在Web项目的目标文件夹中具有完整的WAR,我可以将其部署到Tomcat中。

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

1)是否有一种方法可以简单地为两个子项目声明Spring依赖项,而无需在每个子项POM.xml中声明依赖项?我只是想确保我没有复制资源。我相信这样做的方法只是在Parent POM.xml中声明依赖关系。

2)如果我做了上面的#1,这是创建项目的最佳方式吗?实际上,WEB模块是包含所有最终jar的模块,实际上就好像SERVICE项目在Tomcat中一样。就Tomcat'知道'而言,所有的东西都是一堆包含类的JAR文件,其中一些已经被写入我的WEB模块中,其中一些已经写入了SERVICE模块中,所有这些与JAR文件无关生产/ Tomcat环境。对或错?

谢谢!

+0

如果这是新的开发,通常最好使用Spring Boot的独立jar而不是部署到外部容器中。 – chrylis

回答

1

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

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

请记住,依赖是传递,因此,如果service-module取决于spring-web(它真正的,或者是你垃圾邮件的依赖?),如果web-module取决于service-module它会在依赖拉也不必重复自己。

如果我做了上面的#1,这是创建项目的最佳方式吗?不,它不是。对你的依赖关系极简:如果你需要它,包含它,但不要“防御地”添加依赖关系。这只会增加你的部署速度并降低构建速度,并增加诸如版本不匹配等问题的机会。据Tomcat'知道',所有的东西都是一堆包含类的JAR文件,其中一些已经写在了我的WEB模块中,其中一些已经写在了SERVICE模块中,所有这些与生产/ Tomcat环境无关。对或错?

大部分是错误的。在一场战争中,您的顶级项目(web-module)直接在归档中存在类,并且依赖项作为jar文件嵌入到其中。但是,Tomcat确实并非区分了service-module和你的Spring和其他依赖。

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

*仅发布依赖关系,但快照在此处不相关。

+0

对,Tomcat不区分。因此,因为MY服务模块类依赖于一些Spring类(如导入@autowired和其他特定于Spring的依赖项),所以我不明白我的Web模块目标中是否只包含最终依赖项jar,或者它们是否可以还需要在服务模块POM依赖中?因为当我去编译我的服务模块,并且我没有将Spring作为依赖项时,它会抛出。这是我感到困惑的地方。在一个完美的最终结果中,我只是在我的Web模块的WAR档案中只有Spring依赖关系。 –

相关问题