如何使 android 库项目依赖于另一个库而不会发生冲突?

How do you make an android library project depend on another library without having conflicts?

我正在构建一个库,并希望将 Volley 用于它的网络方面。我可以打包 Volley jar 并发布 .aar,将源代码复制到我的项目中并发布一个 .jar(blah),或者使用 Gradle 做一些依赖魔法。

无论哪种方式,我猜如果任何试图使用我的库的应用程序也有 Volley 依赖项,无论是通过 .jar 还是 gradle,我都会发生冲突。

正确的做法是什么?

我宁愿不只是要求用户删除他们自己对 Volley 的依赖,以避免在多个事物定义它的情况下出现 dexexception,因为这似乎是这些错误的最常见解决方案。

谢谢

如果您与传递依赖发生冲突,您可以将其排除或不在您的项目中定义它并使用库项目中的那个。

Gradle

dependencies {
    compile("org.gradle.test.excludes:api:1.0") {
        exclude module: 'shared'
    }
}

行家

  <dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>

参考:

Gradle http://www.gradle.org/docs/current/userguide/dependency_management.html

Maven http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

Volley 是一项困难的任务,因为尚未发布官方工件。您可以对库项目做的事情是将 Volley 定义为 provided 依赖项。这将根据 Volley 代码编译您的源代码,但不会将 Volley 代码与您的 AAR 打包在一起。它看起来像这样:

dependencies {
    //If you have source
    provided project(':volley')
    //If you have a jar
    provided files('path/to/volley.jar')
}

这并不理想,因为它需要使用您的库的人声明 Volley 依赖项。由于没有官方工件,他们拥有的 Volley 版本可能与您编译的目标不兼容。