1+ < ?xml version="1.0" encoding="utf-8"?>
2+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4+
5+ < html xmlns ="http://www.w3.org/1999/xhtml ">
6+ < head >
7+ < title > Maven离线编译方法</ title >
8+ < meta name ="keywords " content ="Others "/>
9+ < link href ="../Styles/Style0001.css " type ="text/css " rel ="stylesheet "/>
10+ </ head >
11+
12+ < body >
13+ < h1 > Maven离线编译方法</ h1 >
14+
15+ < p class ="date "> 2021-11-19</ p >
16+
17+ < a class ="home " href ="https://xdcsy.github.io/ "> < view all posts</ a >
18+
19+ < p > 有时候我们在把jar包传到某些连不上Maven库的环境后,才发现其中有一点问题需要修改代码。这时候可以到开发机上重新打包再传一遍,但是如果经常需要这样来回就显得有点麻烦。这时候我们可以有另一个选择,就是利用Maven的offline模式在离线环境里面重新编译。</ p >
20+
21+ < p > 因为离线环境是下载不到Maven依赖包的,首先我们要在开发环境把依赖都打包好,传到离线环境里面:</ p >
22+
23+ < p > 1、给开发机器新建一个本地Maven依赖库(原本缓存的依赖库一般占用空间会比较大,而其中很多都是当前项目用不到的,因此新建一个空的最好)。Maven的 < span class ="code "> settings.xml</ span > 文件中, < span class ="code "> <localRepository></localRepository></ span > 配置为新的地址。</ p >
24+
25+ < p > 2、在开发机执行 < span class ="code "> mvn dependency:go-offline</ span > ,缓存所有的依赖到依赖库中</ p >
26+
27+ < p > 3、但是, < span class ="code "> mvn dependency:go-offline</ span > 不会缓存一些默认Maven插件的jar包(例如resources plugin等)。这些插件是打包需要用到的,不过我们通常不在项目的pom文件中声明,这是因为它们在Maven自带的super pom当中被隐式引入了。但导出依赖的时候它们就不能被自动导出了,所以我们需要用help目标来强制缓存这些插件,运行:</ p >
28+
29+ < pre > mvn assembly:help compiler:help enforcer:help exec:help failsafe:help install:help jar:help resources:help surefire:help</ pre >
30+
31+ < p > 4、我们还需要执行一下准备在离线环境运行的命令,例如 < span class ="code "> mvn clean package</ span > 。否则之后还是会缺少插件,比如clean插件,在执行前是不会自动缓存的。</ p >
32+
33+ < p > 5、把Maven、开发机的本地依赖库、代码打包传到离线环境</ p >
34+
35+ < p > 6、配置离线环境中Maven的 < span class ="code "> settings.xml</ span > ,包括 < span class ="code "> <localRepository></localRepository></ span > 和 < span class ="code "> <offline>true</offline></ span > 这两项</ p >
36+
37+ < p > 7、把Maven加入PATH,chmod赋权</ p >
38+
39+ < p > 8、这里有一个额外的步骤,需要删除本地依赖库中所有的 < span class ="code "> *.repositories</ span > 、 < span class ="code "> *.sha1</ span > 、 < span class ="code "> *.lastUpdated</ span > 文件,否则即使在离线模式,Maven还是会尝试联网,然后报错(应该是Maven的bug):</ p >
40+
41+ < pre > find -iname "*.repositories" -exec rm -f {} \; && \
42+ find -iname "*.sha1" -exec rm -f {} \; && \
43+ find -iname "*.lastUpdate" -exec rm -f {} \;</ pre >
44+
45+ < p > 网上也有帖子说直接把依赖库中 .jar 以外的文件全删了也行</ p >
46+
47+ < p > 9、在离线环境用 -o -nsu 参数执行需要的Maven目标,例如 < span class ="code "> mvn -nsu -o clean package</ span > ,就可以成功离线编译打包了</ p >
48+
49+ < p > 其中,-o表示离线模式,-nsu表示不检查snapshot版本的更新</ p >
50+
51+
52+ < hr />
53+ < p class ="footer "> This blog is written in EPUB.
54+ The original file is available for < a href ="https://github.com/XDcsy/XDcsy.github.io/raw/main/blog.epub "> download</ a > .</ p >
55+ < p class ="footer "> Feel free to comment by < a href ="https://github.com/XDcsy/XDcsy.github.io/issues/new "> raising an issue < img alt ="GitHub-Mark-32px " src ="../Images/GitHub-Mark-32px.png " class ="github "/> </ a > .</ p >
56+ </ body >
57+ </ html >
0 commit comments