You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Maven构建中访问依赖文件并传递ProGuard映射文件?

Maven构建中访问依赖文件及传递ProGuard映射文件的实现方案

一、打包过程中访问依赖包含的文件

要在Maven打包流程中读取依赖jar内的文件,核心思路是通过maven-dependency-plugin将依赖中的指定文件解压到项目本地目录,后续构建步骤即可直接访问该目录下的文件。

具体配置示例(添加到项目pom.xml的<build><plugins>节点中):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>3.6.0</version>
  <executions>
    <execution>
      <id>unpack-dependency-files</id>
      <phase>process-resources</phase> <!-- 选在资源处理阶段执行,确保后续流程能读取到文件 -->
      <goals>
        <goal>unpack-dependencies</goal>
      </goals>
      <configuration>
        <!-- 限定要处理的依赖范围 -->
        <includeGroupIds>com.example</includeGroupIds>
        <includeArtifactIds>A</includeArtifactIds>
        <includeVersions>1.0.0</includeVersions>
        <!-- 指定要从依赖jar中解压的文件路径 -->
        <includes>**/A-mapping.txt</includes>
        <!-- 解压到项目的目标目录,可自定义路径 -->
        <outputDirectory>${project.build.directory}/dependency-files</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

执行mvn package时,插件会自动将A.jar内的A-mapping.txt解压到target/dependency-files目录,后续打包步骤直接访问该路径即可。

二、传递ProGuard映射文件到应用构建流程

该需求需要分**A项目配置(发布映射文件)和App项目配置(获取并使用映射文件)**两部分实现:

1. A项目:将ProGuard映射文件作为附加构件发布

默认Maven仅发布主jar包,需把A-mapping.txt作为附加构件上传至仓库,才能让App项目依赖获取。

步骤1:配置ProGuard生成映射文件

在A项目的pom.xml中配置ProGuard插件,指定映射文件输出路径:

<plugin>
  <groupId>com.github.wvengen</groupId>
  <artifactId>proguard-maven-plugin</artifactId>
  <version>2.6.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>proguard</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <!-- 其他ProGuard混淆配置 -->
    <printMapping>${project.build.directory}/A-mapping.txt</printMapping> <!-- 指定映射文件输出路径 -->
  </configuration>
</plugin>

步骤2:附加映射文件到Maven构件

使用build-helper-maven-plugin将生成的映射文件标记为附加构件:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>3.4.0</version>
  <executions>
    <execution>
      <id>attach-mapping-file</id>
      <phase>package</phase>
      <goals>
        <goal>attach-artifact</goal>
      </goals>
      <configuration>
        <artifacts>
          <artifact>
            <file>${project.build.directory}/A-mapping.txt</file>
            <type>txt</type>
            <classifier>mapping</classifier> <!-- 分类器用于区分主jar和映射文件构件 -->
          </artifact>
        </artifacts>
      </configuration>
    </execution>
  </executions>
</plugin>

执行mvn deploy后,仓库中会同时存在A-1.0.0.jar和A-1.0.0-mapping.txt两个构件。

2. App项目:获取映射文件并在ProGuard中使用

步骤1:依赖A项目的映射文件构件

在App项目的pom.xml中添加对映射文件的依赖:

<dependencies>
  <!-- 主依赖A.jar -->
  <dependency>
    <groupId>com.example</groupId>
    <artifactId>A</artifactId>
    <version>1.0.0</version>
  </dependency>
  <!-- 依赖A的映射文件构件,仅构建时使用 -->
  <dependency>
    <groupId>com.example</groupId>
    <artifactId>A</artifactId>
    <version>1.0.0</version>
    <classifier>mapping</classifier>
    <type>txt</type>
    <scope>provided</scope>
  </dependency>
</dependencies>

步骤2:解压映射文件到共享目录

用maven-dependency-plugin将映射文件解压到统一的共享目录(如target/mappings):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>3.6.0</version>
  <executions>
    <execution>
      <id>unpack-mappings</id>
      <phase>process-resources</phase>
      <goals>
        <goal>unpack-dependencies</goal>
      </goals>
      <configuration>
        <includeGroupIds>com.example</includeGroupIds>
        <includeArtifactIds>A</includeArtifactIds>
        <includeClassifiers>mapping</includeClassifiers>
        <includeTypes>txt</includeTypes>
        <outputDirectory>${project.build.directory}/mappings</outputDirectory> <!-- 统一共享目录 -->
      </configuration>
    </execution>
  </executions>
</plugin>

步骤3:在App的ProGuard中引入映射文件

在App的ProGuard配置文件(如proguard.cfg)中指定映射文件路径:

-applymapping ${project.build.directory}/mappings/A-mapping.txt

也可直接在ProGuard插件配置中传入参数,避免硬编码路径:

<plugin>
  <groupId>com.github.wvengen</groupId>
  <artifactId>proguard-maven-plugin</artifactId>
  <version>2.6.0</version>
  <configuration>
    <!-- 其他ProGuard混淆配置 -->
    <options>
      <option>-applymapping ${project.build.directory}/mappings/A-mapping.txt</option>
    </options>
  </configuration>
</plugin>

执行App项目的mvn package时,ProGuard会自动读取共享目录中的A-mapping.txt完成映射复用。

内容的提问来源于stack exchange,提问作者Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:05:36