java - Android如何用本地类覆盖远程包中的类

标签 java android gradle

我的应用程序依赖于一个远程包,该包托管在服务器存储库中。该软件包是独立维护的。

现在我想在远程包中扩展一个类。我创建了同一类的本地副本,并出于实验目的对其进行了修改。这样,我不需要修改库,将其推送到存储库并为每个调试周期编译我的应用程序。

但是,应用程序编译仍然使用远程类而不是本地扩展副本。并报错。

error: cannot find symbol variable XXX_XX1
error: cannot find symbol variable XXX_XX2

那些变量 XXX_XX1 和 XXX_XX2 是新添加到本地类 A

远程库 repo:org.example.packagename.datamodel.classA

本地源路径
.\android\app\src\mock\java\org\example\packagename\datamodel\classA.java

我的问题是如何要求 Android Studio 在编译期间使用 classA 的本地副本而不是远程副本?

更新

经过仔细检查,只有单元测试文件夹中的那些类会报告错误。并且主程序类不会报告错误(但是,可能会在编译单元测试类之后)。
Error:Execution failed for task ':app:compileMockDebugUnitTestJavaWithJavac'. Compilation failed; see the compiler error output for details.

最佳答案

一种相当直接的方法是向您的测试项目添加一个模块,其源文件是您修改后的库版本。然后,您将删除二进制依赖项并将其替换为对这个新模块的依赖项。它应该看起来像这样......

settings.gradle添加

include ':libraryName'
project(':libraryName').projectDir = new File('/path/to/library/sources')

build.gradle应用程序
// compile 'groupId:artifactId:version' // <-- comment out the published binary
compile project(':shared') // <-- add your local module

做一个 gradle 同步,你应该处于良好状态。请记住 不是 完成后在您的测试项目中提交这些更改。

我过去采用的另一种方法是使用 maven gradle 插件将库发布到我的本地 maven 存储库(使用新版本名称)。然后在测试项目中我会更新版本名称并添加
repositories {
    mavenLocal()
}

这可能有点复杂,但它的优点是不会弄乱模块——你仍然在引入二进制依赖项,它只是从你的 maven 存储库本地提供的,而不是从 web 下载的。你只需要记住不是 提交您对库源所做的任何更改并构建与本地发布相关的文件。

关于java - Android如何用本地类覆盖远程包中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943867/

相关文章:

java - Itext 7 PDF - 与 Itext 5 不同,将图像添加到文档不会刷新到磁盘,而是保留在内存中

java - Gradle 错误 :Gradle DSL method not found: 'executeWithoutThrowingTaskFailure()'

android - 用于本地测试的 Spoon JAR

java - Java 中从整型到 char 的隐式类型转换是如何工作的(Java 基础)

Android Volley 库 : do we always have to repeat Response. Listener 和 Response.ErrorListener

安卓抽屉导航

gradle - 向Gradle exec任务添加参数时没有此类文件或目录

java - 使用 Eclipse 创建 Servlet 后,Tomcat 7 服务器无法启动

java - 具有动态代理对象的 ComboBoxModel

java - Hibernate 标准投影