【问题标题】:How I can build java module first then the rest of my android application?如何先构建 java 模块,然后构建我的 android 应用程序的其余部分?
【发布时间】:2021-07-25 17:07:09
【问题描述】:

在我的 java 项目中,我有以下文件夹:

  • app 包含 android 特定应用程序
  • settings_fetcher 是一个java模块

我要做的是首先构建 java 模块,创建一个 .jar 文件,然后将 .jar 文件移动到 ./app/libs,然后构建应用程序的其余部分。

app 文件夹包含以下build.gradle

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.3"
    }
}

plugins {
    id 'com.android.application'
}

def versionCodeDate() {
    return new Date().format("yyyyMMdd").toInteger()
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "pcmagas.vodafone_fu_h300s"
        minSdkVersion 28
        targetSdkVersion 30
        versionCode versionCodeDate()
        versionName "v"+versionCodeDate()

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            println 'In release configs'
            def keystoreFile = rootProject.file(".keys/h300s.keystore")
            def env = System.getenv();

            if(env.containsKey('KEYSTORE_FILE')){
                keystoreFile = rootProject.file(env.get('KEYSTORE_FILE'))
            }

            if (keystoreFile.exists() ) {
                println("Configuring Signing options for release")

                android.signingConfigs["release"].storeFile = keystoreFile
                android.signingConfigs["release"].storePassword = System.getenv('MYAPP_RELEASE_STORE_PASSWORD')
                android.signingConfigs["release"].keyAlias = System.getenv('KEYALIAS')
                android.signingConfigs["release"].keyPassword = System.getenv('MYAPP_RELEASE_KEY_PASSWORD')
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            signingConfig =  signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    testOptions {
        unitTests.returnDefaultValues = true
    }
}

repositories {
    google()
    jcenter()
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.annotation:annotation:1.1.0'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
    implementation 'androidx.activity:activity-ktx:1.2.0'
    implementation 'androidx.fragment:fragment:1.3.0'

    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'org.json:json:20210307'

    testImplementation 'com.github.gmazzo:okhttp-mock:1.4.1'
    testImplementation 'junit:junit:4.+'
    testImplementation 'org.mockito:mockito-core:3.+'

    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

虽然settings_fetcher 包含以下build_gradle

plugins {
    id 'java-library'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}


task makeJar(type: Copy) {
    from('build/libs/')
    into('../app/libs/')
    include('settings_fetcher.jar')
}

有什么想法可以解决这个问题吗?

换句话说,我想要做的是当我运行以下命令之一时:

  • gradlew assemble^flavor^
  • gradlew build
  • gradlew build^flavor^

^flavor^ 是我的应用程序的风格,可以是 DebugRelease

为了能够先构建.jar 文件,然后再构建我的应用程序的apk。

【问题讨论】:

    标签: java android gradle


    【解决方案1】:

    在您的情况下,settings_fetcher 是您的 app 的依赖项,假设 settings_fetcher 被创建为 java-library,那么您可以执行以下操作:

    在位于app 文件夹中的build.gradle 中,将settings_fetcher 项目作为依赖项:

    // rest of build.gradle goes here
    dependencies{
      // Your app's dependencies goes here
      implementation project(":settings_fetcher")
    }
    

    因此,一旦您运行 ./gradlew build,您的库的 jar 文件将位于 ./settings_fetcher/build/libs 文件夹中。因此,也不需要makeJar 任务。

    库依赖

    此外,在您的情况下,任何库依赖项都应放置在其各自的build.gradle 中,即位于dependencies 部分中的settings_fetcher 文件夹中。

    例如,如果您的库需要 okHttp 客户端,则使用:

    dependencies {
        implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    }
    
    

    此外,为了使用 3rd 方库,请确保您也拥有适当的存储库,例如一个公共存储库是 jcenter 之一:

    repositories {
        jcenter()
    }
    

    最终的 build.gradle 位于 settings_fetcher 文件夹中

    因此,如果不需要额外的库,最终的 build.gradle 将是这个:

    plugins {
        id 'java-library'
    }
    
    java {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }
    
    

    或者,如果您需要一些额外的依赖项和库:

    plugins {
        id 'java-library'
    }
    
    java {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }
    
    dependencies {
      // App dependencies go here.
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 2020-09-02
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多