在Android项目中使用Gradle覆盖具有相同包的类

时间:2016-09-01 14:07:07

标签: java android gradle

我必须使用不同的源树。在第二个源树中,几个类重写了第一个源树中的tose。它看起来像:

  • 项目 |
    • 源树-1 / SRC / COM /公司名称/ MyClass.java
      • ...
    • 源树-2 / SRC / COM /公司名称/ MyClass.java
      • ...

使用Gradle编译时出现错误 错误:(20,8)错误:重复的类:com.companyname.MyClass

有没有办法指定从源树2中取出Class并忽略另一个? 使用exclude不会工作,因为这将删除package和classname指定的所有类。

sourceSets {
    main.java.srcDirs += '../../sourcetree-1/'
    main.java.srcDirs += '../../sourcetree-2/'
    main {
        java {
            exclude 'com/companyname/MyClass.java'            
        }
   }
}

我需要使用gradle覆盖它们,因为首先来自源树1的类使用java.awt包中的类,我不能在Android项目中使用它们。源树2中的第二个类将覆盖第一个类,而不使用禁用包中的任何类。

不幸的是,我无法使用此类更改源树1或任何其他类中的类。所以我需要覆盖这个类。

1 个答案:

答案 0 :(得分:0)

我已经定义了两个不同的源集。

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        seccomdev {
            java {
                srcDirs '../../SecCommerce-Dev/'
        exclude '....'
        exclude '....'
        exclude '....'
            }
        }

        main {
            java {
                srcDirs '../../SecCommerce-Android/src/'
                srcDirs '../../SecCommerce-Android/gen/'
            }
        }
    }
}

所以问题是如何在编译项目时组合这些源集。 如果你谷歌你会发现类似的东西:

main {
        java {
           compileClasspath += seccomdev.output
           runtimeClasspath += seccomdev.output
        }
    }

在这种情况下,我收到错误:错误:(122,0)无法获取未知属性' compileClasspath'为......

另一个找到的解决方案是添加依赖项:

dependencies {
    compile android.sourceSets.seccomdev
}

但是我收到错误:错误:(134,0)无法将提供的表示法转换为依赖类型的对象:source set seccomdev。

使用类似的东西:

dependencies {
    compile files(android.sourceSets.seccomdev.java)
}

我得到:错误:无法将提供的表示法转换为文件或URI:[src / seccomdev / java,.. / .. / SecCommerce-Dev /]。

并使用

dependencies {
    seccomdevCompile ':...'
}

至少会编译gradle文件并开始整个编译过程。不幸的是,根本没有编译来自第一个源树/ sourceSet的java文件。所以我得到了数百个错误,因为无法找到第二个源集的java类中的导入。

所以问题仍然是如何在一次编译中将两个不同的源树组合起来,因为代码依赖性?