如何调用Maven本地仓库JAR?CI/CD中运行Nexus拉取JAR最简方式
好问题,咱们一个个来拆解,给你实用的解决方案:
分两种常见场景,看你的具体需求:
作为Maven项目的依赖引用
这是最常规的用法,直接在项目的pom.xml里添加对应的<dependency>节点即可,指定好JAR的groupId、artifactId和version。Maven会自动优先从本地仓库(一般是系统用户目录下的~/.m2/repository)查找,找不到才会去远程仓库拉取:<dependency> <groupId>com.company</groupId> <artifactId>your-artifact-id</artifactId> <version>1.0.0</version> </dependency>执行
mvn compile或其他生命周期命令时,Maven会自动帮你处理类路径的配置。直接运行该JAR包
如果是要把这个JAR作为独立应用运行,首先找到它在本地仓库的路径(路径结构遵循groupId/artifactId/version/artifactId-version.jar),然后用标准的java -jar命令执行:java -jar ~/.m2/repository/com/company/path/to/my/x-1.0.0.jar嫌手动找路径麻烦的话,也可以用Maven的
exec:exec插件,不用手动定位路径,直接让Maven帮你从本地仓库解析并运行:mvn exec:exec -Dexec.executable="java" -Dexec.args="-jar %classpath" -Dexec.classpathScope=runtime -Dexec.mainClass=com.company.MainClass这个命令会自动处理类路径,你只需要指定主类的全限定名就行。
java -jar运行的最简方式 你提到的java -jar ${MAVEN_HOME}/repository/com/company/path/to/my/x.jar是可行的,但有两个前提:
- 你的CI/CD环境中正确配置了
${MAVEN_HOME}环境变量 - JAR的路径完全匹配(注意:Maven仓库里的JAR文件名一般会包含版本号,比如
x-1.0.0.jar,而不是单纯的x.jar)
不过,还有一种更可靠、更易维护的方法,能避免硬编码路径的问题:
使用Maven的dependency:copy目标
这个命令会自动从Nexus(如果本地仓库没有缓存的话)拉取指定JAR,并把它复制到一个固定的目录(比如项目的./target目录),之后直接运行这个目录里的JAR就好:
# 把JAR复制到target目录,并用简洁的文件名 mvn dependency:copy -Dartifact=com.company:path.to.my:x:1.0.0:jar -DoutputDirectory=./target -Dmdep.useBaseVersion=true # 直接运行target目录下的JAR java -jar ./target/x.jar
其中-Dartifact参数的格式是groupId:artifactId:version:type,-Dmdep.useBaseVersion=true可以让复制后的文件名去掉版本号,更简洁。
为什么这种方法更适合CI/CD?
- 无需硬编码路径:不管Maven本地仓库在CI环境里存放在哪里(有些CI系统会用自定义路径,而非
${MAVEN_HOME}/repository),这个命令都能正常工作 - 依赖解析更明确:确保你拉取的是指定版本的JAR,即使本地缓存过期也能正确获取
- 输出位置固定:
./target是Maven项目的标准目录,你的CI脚本可以稳定依赖这个路径
如果你的CI流水线已经在运行Maven构建,还可以把这个复制步骤集成到pom.xml的构建生命周期中,让它在执行运行步骤前自动完成。
内容的提问来源于stack exchange,提问作者IsaacLevon




