IntelliJ中Maven项目需两次执行package才能导出新版本如何解决
问题根因
这个问题是两个机制叠加导致的:
- 单独执行Maven的
package目标时,不会清空上一次构建的缓存目录target,默认走增量编译逻辑:如果你的修改涉及资源文件(比如plugin.yml、配置模板、语言文件),或者IDE没有在执行Maven命令前把最新修改的代码同步到Maven的构建缓存路径,第一次打包会直接复用target/classes下残留的旧版本类文件和资源,等第一次打包流程走完,IDE才会把新代码同步到缓存目录,第二次打包才能把新内容装进jar。 - 直接把jar输出路径配置为正在运行的服务端
plugins目录时,Windows环境下运行中的服务端进程会锁住已加载的插件jar文件,第一次打包时Maven无法覆盖被锁定的旧文件,实际写入失败,文件夹里留存的还是上一版本的jar;等第一次打包进程结束后文件锁短暂释放,第二次打包才能正常写入新版本文件。
可落地的解决步骤
- 把你侧边栏点击执行的Maven目标从
package换成clean package。clean阶段会在构建开始前彻底删除整个target缓存目录,强制走全量编译、全量资源拷贝流程,从根源上避免旧缓存文件被打入jar包。 - 不要直接把构建输出路径指向正在运行的服务端
plugins目录。先把jar默认输出到项目自身的target目录,等打包流程完全结束、确认服务端没有占用插件jar文件时,再手动/通过Maven拷贝插件把jar移到服务端插件目录,彻底规避文件锁导致的写入失败问题。 - 如果使用IDEA开发,打开设置路径
Build, Execution, Deployment > Build Tools > Maven > Runner,勾选Delegate IDE build/run actions to Maven,同时把运行Maven目标的环境切换为本地独立安装的Maven,不要用IDEA内置的捆绑Maven,避免IDE和Maven各自维护编译缓存、两边内容不同步的问题。 - 本地测试阶段可以搭配PlugMan类的热重载工具使用,等jar文件完全写入完成后再执行插件重载指令,不要在打包流程还没跑完的时候就触发服务端重载,避免加载到写入一半的损坏jar包。
直接输出到运行中服务端插件目录的操作本身就有风险:如果打包过程中服务端刚好扫描到插件目录变动,会直接加载未写完的残缺jar,触发类找不到、配置读取失败等无意义报错,反而拖慢调试效率。
内容的提问来源于stack exchange,提问作者gegenphase
相关产品推荐
相关产品推荐

