如何在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

