如何在Gradle多模块项目中将WAR构件打包进EAR构件?
解决Gradle多模块项目中EAR打包引入指定WAR构件的问题
问题场景
Gradle多模块项目,子项目A生成a.ear,子项目B同时生成b.jar和b.war。当前A的依赖配置仅将b.jar打包进a.ear,但需求是把b.war打包进去。
解决方案
方法1:依赖声明中指定WAR构件
直接在子项目A的build.gradle里,修改deploy依赖,明确指定子项目B的war配置(WAR插件会自动创建这个配置):
plugins { id 'java-library' id 'ear' } dependencies { // 明确指定引用子项目B的war构件 deploy project(path: ':B', configuration: 'war') }
方法2:调整子项目B的构件优先级(可选)
如果希望子项目B被依赖时默认提供WAR构件,可以在B的build.gradle中修改默认构件:
plugins { id 'java-library' id 'war' } // 将war设为项目的默认构件 tasks.named('jar') { enabled = false // 可选:如果不需要生成jar的话 } artifacts { archives tasks.war }
这种方式下,子项目A原来的deploy project(':B')就能自动引入b.war,但会影响其他依赖B的模块(如果其他模块需要jar的话就不适用)。
原理说明
当直接依赖project(':B')时,Gradle默认会使用子项目的默认构件(由java-library插件提供的jar)。而WAR插件会额外创建一个war配置,对应生成的war文件,通过指定configuration: 'war'就能精准引入该构件。
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

