1. 问题描述与解决方案选择

Maven 作为强大的构建工具,其公共仓库资源无可匹敌。但实际开发中总会遇到一些棘手情况:

  • 某些 JAR 包未托管在任何仓库
  • 托管仓库不稳定(关键时刻可能宕机)

面对这种场景,通常有三种解决方案:

方案一:部署专业仓库管理工具(如 Nexus)
⚠️ 优点:企业级解决方案,功能完善
❌ 缺点:配置复杂,为单个 JAR 包部署小题大做

方案二:上传至公共仓库
⚠️ 优点:一劳永逸的标准化方案
❌ 缺点:流程冗长(需 Maven Central 审核),且库可能根本不支持 Maven

方案三:使用 maven-install-plugin 本地安装
⚠️ 优点:简单粗暴,无需额外基础设施
❌ 缺点:仅限本地开发环境

📌 结论:对于临时需求或小型项目,方案三是最优解。企业级项目建议方案一。

2. 使用 maven-install-plugin 安装本地 JAR

2.1 完整配置示例

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-install-plugin</artifactId>
   <version>3.1.2</version>
   <configuration>
      <groupId>org.somegroup</groupId>
      <artifactId>someartifact</artifactId>
      <version>1.0</version>
      <packaging>jar</packaging>
      <file>${basedir}/dependencies/someartifact-1.0.jar</file>
      <generatePom>true</generatePom>
   </configuration>
   <executions>
      <execution>
         <id>install-jar-lib</id>
         <goals>
            <goal>install-file</goal>
         </goals>
         <phase>validate</phase>
      </execution>
   </executions>
</plugin>

2.2 配置详解

2.2.1 构件信息配置

核心参数与 Maven 依赖声明高度一致:

  • groupId/artifactId/version强制必填,唯一标识构件
  • packaging:默认 jar,明确指定为 JAR 包
  • file:JAR 文件路径
    ✅ 支持绝对路径
    ✅ 支持相对路径(如 ${basedir}/dependencies/ 指向项目根目录下的 dependencies 文件夹)

2.2.2 执行阶段绑定

<phase>validate</phase>
  • 绑定到 validate 阶段(生命周期最早阶段)
  • 确保在编译前完成安装

💡 执行命令

mvn validate  # 显式触发安装
mvn clean install  # 后续正常构建

2.3 POM 文件处理策略

场景一:无依赖的简单 JAR

<generatePom>true</generatePom>
  • Maven 自动生成最小化 POM
  • 适用于无运行时依赖的独立 JAR(如工具类库)

场景二:含复杂依赖的 JAR

<generatePom>false</generatePom>
<pomFile>${basedir}/dependencies/someartifact-1.0.pom</pomFile>
  • 需手动提供自定义 POM 文件
  • 优势:自动管理依赖传递,避免在主 POM 中重复声明

⚠️ 踩坑提醒:若忽略依赖管理,运行时可能抛出 ClassNotFoundException

3. 通过 Maven 命令安装本地 JAR

3.1 准备 JAR 包

项目结构示例

$ exa --tree .
.
├── com
│  └── baeldung
│     └── HelloWorld.java
└── manifest.txt

核心代码实现

// com/baeldung/HelloWorld.java
package com.baeldung;

public class HelloWorld {
    public static void hello() {
        System.out.println("Hello, world!");
    }

    public static void main() {
        hello();
    }
}

打包流程

# 1. 编译 Java 文件
$ javac com/baeldung/HelloWorld.java

# 2. 创建 manifest.txt
$ cat manifest.txt
Main-Class: com.baeldung.HelloWorld

# 3. 打包为 JAR
$ jar cvfm HelloWorld.jar manifest.txt com/baeldung/HelloWorld.class
added manifest
adding: com/baeldung/HelloWorld.class(in = 479) (out= 320)(deflated 33%)

3.2 安装到本地仓库

$ mvn install:install-file \
-Dfile=HelloWorld.jar \
-DgroupId=com.baeldung \
-DartifactId=hello-world \
-Dversion=1.0 \
-Dpackaging=jar

[INFO] Scanning for projects...
[INFO] --- install:3.1.0:install-file (default-cli) @ standalone-pom ---
[INFO] Installing /Users/alex/baeldung/my-lib/HelloWorld.jar to /Users/alex/.m2/repository/com/baeldung/hello-world/1.0/hello-world-1.0.jar
[INFO] BUILD SUCCESS

验证安装结果

$ exa --tree ~/.m2/repository/com/baeldung/hello-world
/Users/alex/.m2/repository/com/baeldung/hello-world
├── 1.0
│  ├── _remote.repositories
│  ├── hello-world-1.0.jar
│  └── hello-world-1.0.pom  # 自动生成的 POM 文件
└── maven-metadata-local.xml

3.3 在项目中使用本地 JAR

创建 Maven 项目

$ mvn archetype:generate \
-DgroupId=com.baeldung \
-DartifactId=my-project \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false

添加依赖配置

<!-- pom.xml -->
<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0</version>
</dependency>

调用本地 JAR 方法

// src/main/java/com/baeldung/App.java
public class App {
    public static void main(String[] args) {
        com.baeldung.HelloWorld.hello();  // 调用本地 JAR 的方法
    }
}

运行验证

$ mvn clean install && mvn exec:java -Dexec.mainClass="com.baeldung.App"

[INFO] --- exec:3.1.0:java (default-cli) @ my-project ---
Hello, world!  # 成功输出
[INFO] BUILD SUCCESS

4. 总结

本文系统介绍了两种 Maven 本地 JAR 安装方案:

  1. 插件方案:通过 maven-install-plugin 在构建时自动安装(适合团队协作)
  2. 命令方案:使用 mvn install:install-file 手动安装(适合快速验证)

🎯 核心要点

  • 优先选择插件方案实现自动化
  • 复杂依赖务必提供自定义 POM
  • 本地仓库路径:~/.m2/repository/

这两种方案完美解决了特殊 JAR 包的集成问题,无需依赖外部仓库即可快速推进开发进度。


原始标题:Install Local Jar With Maven Baeldung