如何解决More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations

解决Android打包错误
本文介绍了解决Android项目中因重复的androidx-annotations.pro文件导致的打包错误问题,提供了修改build.gradle文件的具体方法。

今天在开发时导入androidx.annotation后出现了错误:

More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations.pro' 

导入的build.gradle

dependencies {
    // https://mvnrepository.com/artifact/androidx.annotation/annotation
    implementation group: 'androidx.annotation', name: 'annotation', version: '1.1.0-alpha02'
}

错误:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
	at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
	at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:256)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations.pro'
	at com.android.builder.merge.StreamMergeAlgorithms.lambda$acceptOnlyOne$2(StreamMergeAlgorithms.java:75)
	at com.android.builder.merge.StreamMergeAlgorithms.lambda$select$3(StreamMergeAlgorithms.java:100)
	at com.android.builder.merge.IncrementalFileMergerOutputs$1.create(IncrementalFileMergerOutputs.java:86)
	at com.android.builder.merge.DelegateIncrementalFileMergerOutput.create(DelegateIncrementalFileMergerOutput.java:61)
	at com.android.build.gradle.internal.transforms.MergeJavaResourcesTransform$1.create(MergeJavaResourcesTransform.java:379)
	at com.android.builder.merge.IncrementalFileMerger.updateChangedFile(IncrementalFileMerger.java:221)
	at com.android.builder.merge.IncrementalFileMerger.mergeChangedInputs(IncrementalFileMerger.java:190)
	at com.android.builder.merge.IncrementalFileMerger.merge(IncrementalFileMerger.java:77)
	at com.android.build.gradle.internal.transforms.MergeJavaResourcesTransform.transform(MergeJavaResourcesTransform.java:411)
	at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
	at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
	at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
	at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
	... 33 more

 

解决方法:

修改build.gradle打包的时候忽略掉 androidx-annotations.pro

// app module下的gradle脚本
android {
    packagingOptions {
        exclude 'META-INF/proguard/androidx-annotations.pro'
    }
}

 

参考来源:

https://stackoverflow.com/questions/52518378/more-than-one-file-was-found-with-os-independent-path-meta-inf-proguard-android

<think>嗯,用户遇到了一个关于Jackson-databind的Jar包问题,具体是无法处理META-INF/versions/9/module-info.class导致的注解问题。我需要根据提供的引用信息来找出解决方案。首先,用户提到引用[1]中解决了类似问题,通过在ProGuard配置中排除特定类。这可能适用于这里的情况,需要检查构建工具是否有类似的排除配置。比如,Maven的依赖排除或者构建插件中的配置。 然后,用户提到引用[3]中排除了org.glassfish的依赖,但问题依旧。这说明可能需要直接处理Jackson-databind本身的依赖。Jackson-databind可能包含模块信息,而旧版本的Java或构建工具可能无法正确处理这些模块信息。需要确认用户使用的Jackson版本是否过高,或者是否需要升级构建工具。 用户的问题可能出现在构建过程中,比如使用Maven Shade插件或Spring Boot的打包插件时,这些工具可能在处理模块信息时出错。参考引用[1]中的方法,可能需要在构建配置中添加排除规则,过滤掉module-info.class文件。例如,在Maven的maven-shade-plugin中添加过滤器,或者在Spring Boot的插件配置中排除这些类。 另外,用户可能需要升级Jackson到较新的版本,因为新版本可能已经解决了与模块系统相关的问题。检查Jackson的官方文档或更新日志,看看是否有相关的修复。同时,确保使用的Java版本与Jackson版本兼容,Java 9及以上版本需要相应的模块支持,而旧版本Java可能无法处理这些模块信息。 还需要检查依赖树,确认是否有冲突的依赖引入了不同版本的Jackson组件,使用Maven的dependency:tree命令来分析。如果有冲突,排除掉旧版本或冲突的依赖。例如,排除其他依赖中的jackson-databind,并显式引入兼容的版本。 最后,如果用户使用的是ProGuard,可以应用引用[1]中的方法,在配置文件中排除META-INF/versions/9/下的类和module-info.class。类似地,在Gradle或Maven的构建脚本中添加相应的排除规则,确保这些类不被处理或包含在最终的构建结果中。 总结可能的解决步骤:排除模块信息文件、升级Jackson版本、检查依赖冲突、调整构建配置。需要根据用户的具体构建工具和环境来选择合适的解决方案。</think>### 解决 Jackson-databind 模块信息问题的步骤 #### 1. **排除模块信息文件** 在构建工具配置中主动排除模块描述文件 `module-info.class`,适用于 Maven 或 Gradle: ```xml <!-- Maven 构建插件示例(如 maven-shade-plugin) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <configuration> <filters> <filter> <artifact>com.fasterxml.jackson.core:jackson-databind</artifact> <excludes> <exclude>META-INF/versions/9/module-info.class</exclude> </excludes> </filter> </filters> </configuration> </plugin> ``` 此方法通过过滤多版本 JAR 中的模块元数据文件避免冲突[^1]。 #### 2. **升级 Jackson 版本** 检查当前使用的 `jackson-databind` 版本: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.4</version> <!-- 推荐稳定版本 --> </dependency> ``` 新版可能已修复模块系统兼容性问题,且支持 Java 9+ 模块化特性。 #### 3. **检查依赖冲突** 通过 Maven 命令分析依赖树: ```bash mvn dependency:tree -Dincludes=com.fasterxml.jackson.core ``` 若存在多个不同版本的 Jackson 组件(如 `jackson-core`、`jackson-annotations`),需统一版本: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.4</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.4</version> </dependency> ``` #### 4. **调整构建工具配置** 若使用 Spring Boot 打包插件,增加以下配置: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclude> </excludes> </configuration> </plugin> ``` ### 数学公式验证 当处理模块化兼容性时,需验证版本兼容关系: $$ \text{Java版本} \geq \text{Jackson支持的最低Java版本} $$ 例如若 Jackson 2.13 要求 Java 8+,则需确保运行时环境满足: $$ JRE \geq 1.8 $$
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值