Gradle:同一项目中的Java和Android子项目

时间:2017-01-30 06:56:32

标签: java android intellij-idea gradle

TL; DR:是开发纯Java和Android应用程序的唯一方法,是完全不同的Gradle项目吗?

我正在开发一个项目,其中包括一个Android应用程序和一个Java后端(以及一些其他常见的API) 作为IDE,我使用的是IntelliJ Idea 我想有一个Gradle项目(将在一个Idea实例上打开),它包含所有应用程序作为子项目。

我的问题是,为了允许Android插件,我需要在buildScript文件的build.gradle部分进行设置:

dependencies {
    classpath 'com.android.tools.build:gradle:2.2.3'
}

这会强制Android插件进入整个Gradle构建过程,并导致纯Java子项目出错(它们会自动设置为使用Android SDK而不是Java SDK构建)。

我想到的解决方法是创建两个单独的项目(一个用于Android,一个用于Java),将公共JAR导出到本地Maven存储库并将其从那里导入到Android项目中。

是否有更好的解决方案可以让我将所有代码库放在同一个地方?

3 个答案:

答案 0 :(得分:0)

每个项目都有自己的buildscript类路径

根/的build.gradle

project(':java-project') {
    apply plugin: 'java'
}

project(':andoid-project') {
    buildscript {
        dependencies {
            classpath 'com.android.tools.build:gradle:2.2.3'
        }
    }
    apply plugin: 'android'
}

答案 1 :(得分:0)

我不是Android用户,但您可能需要在仅限Java的项目上调整JavaCompile任务,以便编译器分叉并使用不同的javac

allprojects {
    if (plugins.hasPlugin('java') && !plugins.hasPlugin('android')) {
        tasks.withType(JavaCompile) {
            options.fork = true
            options.forkOptions.executable = '/path/to/javac'
        }
    }
}

答案 2 :(得分:0)

您要求的是:您只需要将buildscript 声明从项目移动到android模块。

PROJECT build.gradle可能如下所示:

buildscript {
    // nothing for the project
}

allprojects {
    repositories {
        jcenter() // you could also move this to each module
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Android MODULE build.gradle可能如下所示:

apply plugin: 'com.android.application'
// other pluguins

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
        // other dependencies for the build (apt, retrolambda...)
    }
}

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "my.android.app"
        // additional config...
    }
}

dependencies {
    // your app dependencies here
}

其他模块(如后端或Web)可以使用自己的pluguins,存储库和依赖项声明自己的构建脚本。