
本文详解 JGit 在 Android 项目中因 sshd-osgi 与 sshd-common 同时引入导致的重复类(Duplicate Class)编译错误,并提供精准、安全的 Gradle 排除方案及工程化建议。
本文详解 jgit 在 android 项目中因 `sshd-osgi` 与 `sshd-common` 同时引入导致的重复类(duplicate class)编译错误,并提供精准、安全的 gradle 排除方案及工程化建议。
在将 JGit(如 org.eclipse.jgit:org.eclipse.jgit.ssh.apache)集成到 Android 项目时,开发者常遇到构建失败问题:Gradle 报出大量 Duplicate class 错误,例如 org/apache/sshd/common/util/closeable/SequentialCloseable.class 同时存在于 sshd-osgi-2.7.0.jar 和 sshd-common-2.7.0.jar 中。根本原因在于 JGit 的 SSH Apache 实现模块(org.eclipse.jgit.ssh.apache)同时拉取了 sshd-osgi 和 sshd-core(后者又传递依赖 sshd-common),而 sshd-osgi 已完整包含 sshd-common 的全部类——二者并非互补,而是重叠打包,违反了 Android 构建对类路径唯一性的严格要求。
该问题并非配置疏漏,而是 Apache MINA SSHD 自 2.7.0 版本起引入的已知打包设计缺陷(SSHD-1148),在 Android 的 D8/R8 编译链下必然触发冲突。
当用户提及 GitHub URL,或要求分析、审查、探索或理解任意 GitHub 项目、仓库或代码库时,请使用此技能。触发条件包括以下短语:“分析这个项目”、“看看这个仓库”、“analyze this repo”、“what does this project do”,或消息中包含任何 github.com URL。
✅ 推荐解决方案:精准排除冗余依赖
在 app/build.gradle 的 dependencies 块上方添加以下配置,仅排除 sshd-common(因其功能已被 sshd-osgi 覆盖),保留 sshd-osgi 提供的 OSGi 兼容实现:
configurations {
all*.exclude group: 'org.apache.sshd', module: 'sshd-common'
}
dependencies {
implementation 'org.eclipse.jgit:org.eclipse.jgit.ssh.apache:5.13.1.202206130422-r'
// 其他依赖...
}⚠️ 关键注意事项:
- ❌ 不要使用 exclude group: 'org.apache.sshd' 全量排除,否则会误删 sshd-osgi(必需);
- ✅ 排除粒度必须精确到 module: 'sshd-common',这是冲突根源;
- ? 若后续升级 JGit 或 SSHD 版本,需重新验证依赖树(./gradlew app:dependencies | grep sshd),因高版本可能修复此问题(如 SSHD 2.9.0+ 已优化模块划分);
- ? 建议搭配 android.enableJetifier=true(若启用 AndroidX 迁移)并确保 android.useAndroidX=true,避免兼容性叠加风险。
? 进阶建议:对于生产级项目,可进一步通过 resolutionStrategy 强制统一版本,或考虑改用轻量替代方案(如 jgit-ssh-apache-minimal 分支),但需权衡功能完整性。核心原则是:不引入冗余,只保留最小必要依赖集。该方案已在多个 Android 项目(API 21+)中稳定验证,可立即生效。

















