Gradle:同一个项目上的Java和Android子项目

Gradle:同一个项目上的Java和Android子项目,java,android,intellij-idea,gradle,Java,Android,Intellij Idea,Gradle,TL;DR:开发纯Java和Android应用程序的唯一方法是在完全不同的Gradle项目上吗 我正在开发一个项目,其中包括一个Android应用程序和一个Java后端(以及一些其他常见的API)。 作为IDE,我使用IntelliJ Idea。 我希望有一个单一的Gradle项目(将在单个Idea实例上打开),其中包含所有作为子项目的应用程序 我的问题是为了允许Android插件,我需要在build.gradle文件的buildScript部分设置它: dependencies { c

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

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

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

dependencies {
    classpath 'com.android.tools.build:gradle:2.2.3'
}
这会在整个Gradle构建过程中强制使用android插件,并在纯Java子项目上导致错误(它们会自动设置为使用android SDK而不是Java SDK构建)

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


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

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

root/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'
}

我不是安卓用户,但可能需要调整纯java项目上的任务,使编译器分叉并使用不同的
javac

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

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

项目
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
}
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
}
Android模块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
}
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,可能会使用自己的插件、存储库和依赖项声明自己的构建脚本。

您可以使用android Studio在单个项目中创建android和java模块。对于android gradle,使用
apply plugin:'com.android.application'
对于java gradle,使用
apply plugin:'java'
这将不起作用:我收到一条消息:
未找到id为'com.android.application'的插件。
只有将
com.android.tools.build:gradle:2.2.3
添加到buildGradle节内的类路径依赖项。是。应该将其添加到项目级gradle文件中这是我试图避免的:这样设置类路径,会强制所有项目使用Android插件,而不是Java插件。那么我想最好使用两个不同的项目。找到其他方法将它们相互链接。e、 也许我做错了什么,但这仍然迫使所有项目使用Android插件类路径。下面是
root/build.gradle
的样子:所有项目{group'com.navnplay'应用插件:'idea'存储库{mavenCentral()}}
project(':navnplay app'){buildscript{repositories{jcenter()}依赖项{classpath'com.android.tools.build:gradle:2.3'}}
很难说。。。但我认为您正在
allprojects
闭包中设置
buildscript
,它。。。顾名思义。。。影响所有项目
buildscript
肯定在项目部分,而不是
allprojects
部分。