多模块Maven WAR项目依赖问题:WebService项目如何引用Web项目业务层?
嘿,这个问题我碰到过好多次了,本质是Maven对war包的依赖限制导致的——war包是用来部署的归档文件,默认不能被其他模块直接依赖。给你两个解决方案,优先推荐第一个,是长期维护的最优解:
方案1:拆分共享核心模块(强烈推荐)
这是Maven多模块项目的标准实践,把共享的业务逻辑抽离出来,彻底解决依赖问题:
- 第一步:在
ParentService父模块下新建一个Jar类型的子模块,比如叫ChildService-core(或者ChildService-common,名字只要清晰好懂就行) - 第二步:把
ChildService-web里的DAO层、Service层(也就是ChildService-webService需要用到的那些代码)全部迁移到这个core模块里 - 第三步:修改各模块的依赖配置:
- 在
ChildService-web的pom.xml中,添加对core模块的依赖:<dependency> <groupId>你的项目groupId</groupId> <artifactId>ChildService-core</artifactId> <version>你的项目版本号</version> </dependency> - 在
ChildService-webService的pom.xml中,同样添加这个core模块的依赖
- 在
- 第四步:确保
core模块的pom.xml里打包方式为jar(Maven默认就是jar,不过明确写出来更清晰):<packaging>jar</packaging>
这么做的好处是共享代码只维护一份,web和webService都依赖这个轻量的核心jar,完全符合模块化设计原则,后续扩展和维护都省心。
方案2:强制依赖war包(临时救急,不推荐)
如果暂时没时间重构模块,也可以通过配置让Maven允许依赖war包,但这个方式不优雅,只适合临时过渡:
- 首先在
ChildService-web的pom.xml中配置maven-war-plugin,让它生成包含编译后class文件的附属jar:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <!-- 用最新稳定版本即可 --> <configuration> <attachClasses>true</attachClasses> </configuration> </plugin> </plugins> </build> - 然后在
ChildService-webService的pom.xml中,添加对ChildService-web的依赖,指定类型为war并使用classes分类器(只取class文件,不要整个war包):<dependency> <groupId>你的项目groupId</groupId> <artifactId>ChildService-web</artifactId> <version>你的项目版本号</version> <type>war</type> <classifier>classes</classifier> </dependency>
为什么不推荐方案2?
- war包里包含大量web层冗余内容(比如webapp目录、静态资源、web配置文件),会增加依赖体积和部署复杂度
- 共享代码和web层代码耦合在一起,后续修改业务逻辑时容易影响到web模块,维护成本高
- 容易引发类冲突、依赖传递异常等问题
所以还是优先选择方案1,重构出核心模块,这才是长期的正确做法。
内容的提问来源于stack exchange,提问作者OddDev
相关产品推荐
相关产品推荐

