如果需要保留本地 JAR 依赖,但不将本地Jar其打包到项目的最终 JAR 中 (即编译时使用本地 JAR,运行时手动提供该 JAR),可以通过 Maven 的 system
范围依赖实现,这也是处理本地非仓库 JAR 的标准方式。
具体配置步骤
在 pom.xml
中按以下方式配置依赖:
<dependencies>
<!-- 其他依赖 -->
<!-- 本地 JAR 依赖配置 -->
<dependency>
<groupId>com.ciphergateway</groupId> <!-- 自定义 groupId -->
<artifactId>aoe-plugin-cg</artifactId> <!-- 自定义 artifactId -->
<version>1.0.0</version> <!-- 自定义版本号 -->
<scope>system</scope> <!-- 关键:system 范围表示依赖本地文件 -->
<!-- 本地 JAR 的绝对路径或相对路径 -->
<systemPath>${project.basedir}/lib/aoe-xx-cg.jar</systemPath>
</dependency>
</dependencies>
配置说明
-
scope>system</scope
:这是核心配置,声明该依赖是本地系统级别的,Maven 不会从仓库下载,也不会将其打包到项目的最终 JAR/WAR 中(仅在编译和测试时使用本地文件)。 -
systemPath
路径:- 推荐使用相对路径(通过
${project.basedir}
引用项目根目录),例如${project.basedir}/lib/aoe-xx-cg.jar
表示 JAR 放在项目根目录的lib
文件夹下。 - 也可以使用绝对路径(如
D:/libs/aoe-xx-cg.jar
),但相对路径更便于团队协作(需确保团队成员的项目结构一致)。
- 推荐使用相对路径(通过
运行时注意事项
由于该 JAR 不会被打包到项目产物中,运行时必须手动提供该 JAR ,否则会报 ClassNotFoundException
。有两种方式:
- 运行时通过
-cp
指定类路径:执行项目 JAR 时,将本地 JAR 路径加入类路径:
假设项目 JAR 是 app.jar,本地 JAR 在 ./lib 目录
java -cp "app.jar:./lib/aoe-xx-cg.jar" 主类全限定名
-
(Windows 系统用
;
分隔路径:java -cp "app.jar;./lib/aoe-xx-cg.jar"
) -
将 JAR 放到 JRE 的扩展目录 :复制 JAR 到
JRE安装目录/lib/ext
下(不推荐,可能影响其他程序)。
优缺点
- 优点:简单直接,无需将本地 JAR 上传到仓库,且不会污染项目的打包产物。
- 缺点:依赖本地文件路径,移植性较差(需确保所有环境的本地路径都存在该 JAR)。
如果需要更好的移植性,也可以将本地 JAR 安装到本地 Maven 仓库(执行 mvn install:install-file
命令),但这样默认会被打包,需要额外配置排除(适合多人协作场景)。