2021-11-19
< view all posts有时候我们在把jar包传到某些连不上Maven库的环境后,才发现其中有一点问题需要修改代码。这时候可以到开发机上重新打包再传一遍,但是如果经常需要这样来回就显得有点麻烦。这时候我们可以有另一个选择,就是利用Maven的offline模式在离线环境里面重新编译。
因为离线环境是下载不到Maven依赖包的,首先我们要在开发环境把依赖都打包好,传到离线环境里面:
1、给开发机器新建一个本地Maven依赖库(原本缓存的依赖库一般占用空间会比较大,而其中很多都是当前项目用不到的,因此新建一个空的最好)。Maven的 settings.xml 文件中, <localRepository></localRepository> 配置为新的地址。
2、在开发机执行 mvn dependency:go-offline ,缓存所有的依赖到依赖库中
3、但是, mvn dependency:go-offline 不会缓存一些默认Maven插件的jar包(例如resources plugin等)。这些插件是打包需要用到的,不过我们通常不在项目的pom文件中声明,这是因为它们在Maven自带的super pom当中被隐式引入了。但导出依赖的时候它们就不能被自动导出了,所以我们需要用help目标来强制缓存这些插件,运行:
mvn assembly:help compiler:help enforcer:help exec:help failsafe:help install:help jar:help resources:help surefire:help
4、我们还需要执行一下准备在离线环境运行的命令,例如 mvn clean package 。否则之后还是会缺少插件,比如clean插件,在执行前是不会自动缓存的。
5、把Maven、开发机的本地依赖库、代码打包传到离线环境
6、配置离线环境中Maven的 settings.xml ,包括 <localRepository></localRepository> 和 <offline>true</offline> 这两项
7、把Maven加入PATH,chmod赋权
8、这里有一个额外的步骤,需要删除本地依赖库中所有的 *.repositories 、 *.sha1 、 *.lastUpdated 文件,否则即使在离线模式,Maven还是会尝试联网,然后报错(应该是Maven的bug):
find -iname "*.repositories" -exec rm -f {} \; && \ find -iname "*.sha1" -exec rm -f {} \; && \ find -iname "*.lastUpdate" -exec rm -f {} \;
网上也有帖子说直接把依赖库中 .jar 以外的文件全删了也行
9、在离线环境用 -o -nsu 参数执行需要的Maven目标,例如 mvn -nsu -o clean package ,就可以成功离线编译打包了
其中,-o表示离线模式,-nsu表示不检查snapshot版本的更新