
JGit 在 Android 项目中因 sshd-osgi 和 sshd-common 同时引入相同类导致编译失败,需通过 Gradle 排除重复模块来修复。
jgit 在 android 项目中因 `sshd-osgi` 和 `sshd-common` 同时引入相同类导致编译失败,需通过 gradle 排除重复模块来修复。
JGit 是一个功能强大的纯 Java Git 实现,但在 Android 平台上直接集成时,常因其 SSH 支持模块(org.eclipse.jgit.ssh.apache)引入的 Apache MINA SSHD 依赖引发构建错误。核心问题是:sshd-osgi-2.7.0.jar 和 sshd-common-2.7.0.jar 包含大量完全相同的工具类(如 SequentialCloseable、LazyIterablesConcatenator 等),而 Android 的 D8/R8 编译器严格禁止重复类定义,从而触发 Duplicate class 编译错误。
该冲突并非配置失误,而是 org.apache.sshd:sshd-osgi:2.7.0 模块本身已内嵌了 sshd-common 的全部公共工具类(OSGi 版本为“fat jar”设计),但 JGit 的依赖树又显式拉取了独立的 sshd-common:2.7.0,造成冗余引入。
✅ 正确解决方案是在 app/build.gradle 中全局排除冲突模块:
configurations {
all*.exclude group: 'org.apache.sshd', module: 'sshd-common'
}
⚠️ 注意事项:
- 不要排除 sshd-osgi:它是 JGit SSH 功能的实际实现载体,排除后将导致 SshTransport 初始化失败;
- 避免使用 exclude group: 'org.apache.sshd' 全组排除:这会误删 sshd-sftp 或 sshd-core 等必要模块;
- 若后续升级 JGit(如 ≥6.0),建议验证 sshd-osgi 是否仍含重复类——新版可能已优化依赖结构;
- 如项目需 SFTP 支持,确保 sshd-sftp 未被意外排除(上述配置仅影响 sshd-common,安全)。
? 补充建议:若仅需本地仓库操作(无 SSH/Git over HTTP),可改用最小化依赖:
implementation('org.eclipse.jgit:org.eclipse.jgit:5.13.1.202206130422-r') {
exclude group: 'org.eclipse.jgit', module: 'org.eclipse.jgit.ssh.apache'
}
这样可彻底规避 SSHD 相关依赖,显著减小 APK 体积并避免兼容性风险。
总之,该问题本质是 OSGi 分发包与常规 Maven 模块共存引发的 Gradle 依赖解析歧义,通过精准排除即可在不修改源码的前提下稳定使用 JGit。











