如何在Maven构建时覆盖远程资源?离线构建Maven 3.5.2求助
我之前在离线环境构建Maven版本时也碰到过一模一样的问题——Maven构建过程中会自动去apache.org拉取许可证文件,没网直接就卡壳失败。下面给你几个实操性强的解决方案,亲测能用:
核心思路
本质就是把构建时需要的远程许可证文件替换成本地文件,让Maven不再尝试联网获取。
具体步骤
1. 提前在联网机器上准备好许可证文件
先找到Maven 3.5.2源码里依赖的许可证地址,最常见的是Apache 2.0许可证,直接下载保存到本地(比如/local-repo/licenses/apache-2.0.txt)。
另外,建议搜索源码里所有pom.xml文件,确认有没有其他远程许可证的引用,一并下载下来。
2. 修改源码中的许可证引用路径
解压Maven 3.5.2的源码包,批量替换所有pom.xml里的远程许可证URL为本地文件路径:
比如原来的配置是:
<licenseUrl>https://www.apache.org/licenses/LICENSE-2.0.txt</licenseUrl>
改成本地文件路径(注意不同系统的路径格式,Linux用file:///开头,Windows用file:///C:/...):
<licenseUrl>file:///local-repo/licenses/apache-2.0.txt</licenseUrl>
如果有其他许可证,比如Apache 1.1之类的,同样替换对应的URL。
3. 确保所有构建依赖已就绪
因为机器离线,你需要先在联网机器上,针对Maven 3.5.2的源码执行:
mvn dependency:go-offline
这个命令会把所有构建需要的依赖下载到本地Maven仓库,然后把整个仓库目录拷贝到离线机器的~/.m2/repository(或者你配置的仓库路径)下。
4. 离线执行构建
最后在离线机器上,加上--offline参数强制Maven不联网,执行构建:
mvn clean install --offline
备选方案:通过Maven插件配置覆盖
如果不想修改源码pom,也可以在构建时指定一个自定义的profile,用maven-resources-plugin把本地许可证文件复制到构建时需要的位置。比如在项目根目录新建一个pom-custom.xml,添加如下配置:
<profile> <id>offline-license</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <executions> <execution> <id>copy-licenses</id> <phase>initialize</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/licenses</outputDirectory> <resources> <resource> <directory>/local-repo/licenses</directory> <includes> <include>*.txt</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
然后构建时指定这个profile:
mvn clean install --offline -P offline-license
不过这个方案需要确保构建过程中引用许可证的路径是指向构建目录下的文件,可能需要配合调整插件的配置,相对来说修改源码pom更直接。
内容的提问来源于stack exchange,提问作者Adam Burley

