Gradle生成war包前如何移动指定目录到根目录并解决构建报错问题
问题原因
- 你当前的实现直接移动编译输出目录
build/classes/java/main/下的____embedded目录,会破坏编译产物的原有结构,IDE的文件监听服务正在监听该编译目录的变更,非预期的目录移除操作触发了VFS同步异常,就是你收到的报错的来源。 - 该逻辑也无法实现需求:war任务默认执行时机晚于
compileJava,你提前把类文件从编译目录移走,war任务从编译目录加载类时反而会缺失____EntryPoint类。
正确实现方案
不需要单独编写移动文件的任务,直接配置war插件的打包规则即可,既不会破坏原有编译产物结构,也能实现将指定目录放到war包根目录的要求:
保留WEB-INF/classes下原有类副本的配置
plugins { id 'war' } war { manifest { attributes( 'Main-Class': '____embedded.____EntryPoint' ) } // 将编译后的____embedded目录拷贝到war包根目录 from "${buildDir}/classes/java/main/____embedded" into "____embedded" }
不保留重复副本的配置
如果不需要在WEB-INF/classes下保留____embedded目录的副本,可以增加排除规则:
plugins { id 'war' } war { manifest { attributes( 'Main-Class': '____embedded.____EntryPoint' ) } from "${buildDir}/classes/java/main/____embedded" into "____embedded" // 排除WEB-INF/classes下的重复目录 exclude "**/____embedded/**" }
可运行war包补充配置
如果需要直接通过java -jar xxx.war运行,需要在manifest中补充类路径配置,指向war包内的依赖包路径:
war { manifest { attributes( 'Main-Class': '____embedded.____EntryPoint', // 类路径指向war包内WEB-INF/lib下的所有依赖 'Class-Path': configurations.runtimeClasspath.files.collect { "WEB-INF/lib/${it.name}" }.join(' ') ) } from "${buildDir}/classes/java/main/____embedded" into "____embedded" exclude "**/____embedded/**" }
内容的提问来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

