【问题标题】:Gradle: Both Java and Android Subprojects on Same ProjectGradle:同一项目上的 Java 和 Android 子项目
【发布时间】:2017-01-30 06:56:31
【问题描述】:

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 项目中。

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

【问题讨论】:

  • 您可以使用 Android Studio 在一个项目中同时创建 android 和 java 模块。对于 android gradle 使用 apply plugin: 'com.android.application' 和对于 java gradle 使用 apply plugin: 'java'
  • 这行不通:我收到一条消息:Plugin with id 'com.android.application' not found. 只有在我将 com.android.tools.build:gradle:2.2.3 添加到 buildGradle 部分内的类路径依赖项中时,该插件才会被识别。
  • 是的。应将其添加到项目级 gradle 文件中
  • 这是我要避免的:以这种方式设置类路径,强制所有项目使用 Android 插件,而不是 Java 插件。
  • 那么我想如果你使用 2 个不同的项目会更好。寻找其他方式将它们相互联系起来。例如带有 jar 的 Maven 仓库

标签: java android intellij-idea gradle


【解决方案1】:

每个项目都有自己的构建脚本类路径

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

【讨论】:

  • 也许我做错了什么,但这仍然会强制所有项目的 Android 插件类路径。这是root/build.gradle 的样子: allprojects{ group 'com.navnplay' apply plugin: 'idea' repositories { mavenCentral() } } project(':navnplay-app') { buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' } } }
  • 很难说...但我认为您将buildscript 设置在allprojects 闭包中...顾名思义...影响所有项目
  • buildscript 肯定在项目部分,而不是在 allprojects 部分。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您的要求是可能的:您只需将 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
    }
    

    其他模块,例如后端或网络,可以使用自己的插件、存储库和依赖项声明自己的构建脚本。

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2015-02-28
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多