1、maven-compiler-plugin

  • 作用:负责编译项目的 Java 源代码
  • 功能:
    1、将 .java 文件编译为 .class 文件
    2、配置 Java 版本(如 source 和 target 版本,兼容 JDK 8/11/17 等)
  • 默认行为:Maven 生命周期中的 compile 阶段会自动调用该插件

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.8</source>
      <target>1.8</target>
    </configuration>
    </plugin>

2、maven-jar-plugin

  • 作用:将编译后的类文件打包成 标准 JAR 文件
  • 功能:
    1、生成 target/{project-name}-{version}.jar
    2、可配置 MANIFEST.MF(如指定主类 Main-Class)
  • 默认行为:Maven 的 package 阶段会自动调用该插件
  • 局限:生成的 JAR 不包含依赖库,仅包含当前项目的代码和资源

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <mainClass>com.example.Main</mainClass>
        </manifest>
      </archive>
    </configuration>
    </plugin>

3、maven-assembly-plugin

  • 作用:创建自定义的分发包,支持多种格式(如 ZIP、TAR、JAR 等)
  • 功能:
    1、生成包含依赖的 Fat JAR(将所有依赖的 JAR 解压后合并到单个 JAR 中)
    2、生成分发包(如包含 bin/、lib/、conf/ 目录的结构)
  • 特点:
    1、通过 descriptor 文件定义打包规则。
    2、适合生成复杂的分发结构,但不处理类冲突(若多个依赖包含相同类,会覆盖

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>com.example.Main</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    </plugin>

4、maven-shade-plugin

  • 作用:创建 Uber JAR(将项目代码和依赖的类重新定位并合并到单个 JAR 中)。
  • 功能:
    1、解决依赖冲突(通过重命名类路径,例如将 org.apache.commons 重定位为 shaded.org.apache.commons)
    2、合并资源文件(如 META-INF/services 文件,避免 ServiceLoader 加载失败)。
  • 特点:
    1、适用于需要解决类冲突的复杂场景。
    2、比 assembly 插件更适合构建可执行的 Fat JAR

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>com.example.Main</mainClass>
            </transformer>
          </transformers>
          <relocations>
            <relocation>
              <pattern>org.apache.commons</pattern>
              <shadedPattern>shaded.org.apache.commons</shadedPattern>
            </relocation>
          </relocations>
        </configuration>
      </execution>
    </executions>
    </plugin>

5、使用 maven-compiler-plugin 与 maven-shade-plugin 组合

maven-shade-plugin 主要用于生成 “uber JAR”(包含所有依赖的可执行 JAR 文件)并且提供重定位功能,避免类冲突

<build>
    <plugins>
        <!-- 编译插件:编译源代码 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <!-- 打包插件:生成包含依赖的 uber JAR -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase> <!-- 在打包阶段执行 -->
                    <goals>
                        <goal>shade</goal> <!-- 使用 shade 目标 -->
                    </goals>
                    <configuration>
                        <createDependencyReducedPom>true</createDependencyReducedPom> <!-- 生成依赖精简的 POM 文件 -->
                        <archive>
                            <manifestEntries>
                                <Main-Class>com.example.MainClass</Main-Class> <!-- 主类 -->
                            </manifestEntries>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

构建过程:
1、编译阶段: 使用 maven-compiler-plugin 将 Java 源代码编译为字节码(.class 文件)。
2、打包阶段: 使用 maven-shade-plugin 将编译后的代码与所有依赖项一起打包成一个 “uber JAR” 文件,并且可以通过 createDependencyReducedPom 生成一个精简的 POM 文件以减少依赖管理问题。

生成的文件:
target/my-app-1.0-SNAPSHOT-shaded.jar(包含依赖的可执行 JAR 文件)

6、使用 maven-compiler-plugin 与 maven-assembly-plugin 组合

maven-assembly-plugin 也可以生成 “fat JAR”(包含所有依赖的可执行 JAR 文件),并且可以生成其他格式的压缩包如 ZIP、TAR 等

<build>
    <plugins>
        <!-- 编译插件:编译源代码 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <!-- 打包插件:生成包含依赖的 fat JAR -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.example.MainClass</mainClass> <!-- 主类 -->
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef> <!-- 指定打包依赖的方式 -->
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase> <!-- 在打包阶段执行 -->
                    <goals>
                        <goal>single</goal> <!-- 使用 single 目标 -->
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

构建过程
1、编译阶段: 使用 maven-compiler-plugin 将 Java 源代码编译为字节码。
2、打包阶段: 使用 maven-assembly-plugin 将编译好的代码及所有依赖项打包成一个 “fat JAR” 文件。

生成的文件
target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar(包含依赖的可执行 JAR 文件)

如感兴趣,点赞加关注,谢谢!!!


journey
37 声望24 粉丝

引用和评论

0 条评论