Gradle Maven 插件“安装”任务不适用于 Android 库项目

Posted

技术标签:

【中文标题】Gradle Maven 插件“安装”任务不适用于 Android 库项目【英文标题】:Gradle Maven plugin "install" task does not work with Android library project 【发布时间】:2013-09-04 18:41:01 【问题描述】:

我想将 android 库项目安装到本地 maven 存储库。 这是build.gradle

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:0.5.+'
    

apply plugin: 'android-library'
apply plugin: 'maven'

version = "1.0.0-SNAPSHOT"
group = "com.example"

repositories 
    mavenCentral()


android 
    compileSdkVersion 18
    buildToolsVersion "17.0.0"

    defaultConfig 
        minSdkVersion 9
        targetSdkVersion 18
    

当我跑步时:

gradle install -i

这里卡住了:

Executing task ':project:installTest' due to:
  Task has not declared any outputs.
Starting process 'command 'd:\android-sdk-windows\platform-tools\adb.exe''. Working directory: D:\Projects\java\....... Command: d:\android-sdk-windows\platform-tools\adb.exe install -r D:\Projects\java\.......\build\apk\project.apk
An attempt to initialize for well behaving parent process finished.
Successfully started process 'command 'd:\android-sdk-windows\platform-tools\adb.exe''
> Building > :project:installTest

所以我注意到的第一件事是它出于某种奇怪的原因尝试将其作为 APK 部署在设备上。

我做错了什么还是只是 android-library 插件与 maven 插件不兼容?

【问题讨论】:

【参考方案1】:

编辑:请参考 github 页面 (https://github.com/dcendents/android-maven-gradle-plugin) 获取最新说明并找到要使用的正确版本。原始说明不再适用于最新的 gradle 版本。

原帖:

我已经修改了 maven 插件以与 android 库项目兼容。项目见github:https://github.com/dcendents/android-maven-gradle-plugin

配置您的 android 库项目以使用它:

buildscript 
    repositories 
        mavenCentral()
    

    dependencies 
        classpath 'com.github.dcendents:android-maven-plugin:1.0'
    


apply plugin: 'android-library'
apply plugin: 'android-maven'

然后您应该能够使用 install 任务将 aar 安装到您的本地 maven 存储库中。

希望对您有所帮助,如果您发现插件有问题,请在 github 上告诉我,我会修复它。

【讨论】:

如何使用这个插件配置groupid、artifactid和版本? 这是一个非常好的解决方案。我现在在我的图书馆项目中使用它!我唯一担心的是,您将如何应对 Gradle Maven 插件的新更新,您是否要让这些更新保持同步? 好吧,到目前为止我不需要这样做,但是如果你(或其他人)注意到它在使用新的 gradle 版本时会中断,那么请在 github 项目上打开一个问题,我会发布一个更新版本。 效果很好,并在此处添加步骤 1 中的几个部分:virag.si/2015/01/publishing-gradle-android-library-to-jcenter,使其也可以推送源代码和 javadoc。 我在使用此解决方案时收到org.gradle.api.internal.project.ProjectInternal.getPluginManager()Lorg/gradle/api/internal/plugins/PluginManagerInternal;【参考方案2】:

详细说明 CyclingSir 的回答,我建议添加一个单独的“installArchives”任务。这也应该注意拾取您的自定义工件(例如源)。

apply plugin: 'maven'

task installArchives(type: Upload) 
  description "Installs the artifacts to the local Maven repository."
  configuration = configurations['archives']
  repositories 
    mavenDeployer 
      repository url: repositories.mavenLocal().url
    
  

请注意,使用 Gradle Android 插件 v0.5.5,gradle install 仍会尝试在设备上安装某些内容。

【讨论】:

效果很好!您可以使用repositories.mavenLocal().url 而不是对其进行硬编码。【参考方案3】:

如果您不想使用自定义插件,有一个更简单的解决方案。相反,只需使用不同的名称重新创建安装任务。我称它为installArchives。将以下代码添加到您的build.gradle

task installArchives(type: Upload) 
    description "Installs the artifacts to the local Maven repository."
    repositories.mavenInstaller 
        configuration = configurations.default
        pom.groupId = 'my.group'
        pom.artifactId = 'my-artifact'
        pom.version = '1.0.0'
    

您现在可以运行 gradle installArchives 在本地安装您的 aar。

【讨论】:

您能否修改您的任务以同时为源代码和 JavaDoc 生成 jars? @JJD 此任务只会从默认配置上传 aar(无 jars)。我不相信 Android gradle 插件支持开箱即用地生成 JavaDocs 或源 aars。弄清楚如何做到这一点可能会引起自己的问题。 当aar部署到maven repo时,生成的pom不包含库项目的依赖。 我遇到了和 Moritz 一样的问题,但是使用 viphe 的方法,一切都按原样上传了。【参考方案4】:

2014 年 11 月 26 日更新

在撰写本文时,以下答案是有意义的,当时 Android 构建工具的版本为 0.5.5。它现在很可能已经过时并且可能不再起作用了。

我已亲自将我的项目切换为使用android-maven-plugin,如上述答案中所述,该插件也适用于最新版本的 Android Build Tools。

2014 年 2 月的原始答案

作为 AAR 发布

如果您不介意使用旧版本的com.android.tools.build:gradle(即0.5.4),您可以使用this blogpost 中描述的方法。并不是说根据the discussion in adt-dev mailing-list,这在 0.5.5 中不起作用。

将以下行添加到您的build.gradle

apply plugin: 'maven-publish'

// load bundleRelease task
// this will not load the task in 0.5.5
android.libraryVariants

publishing 
    publications 
        maven(MavenPublication) 
            artifact bundleRelease
        
    

要发布到本地 maven 仓库,请调用以下命令:

gradle publishToMavenLocal

以 JAR 形式发布

如果您的 Android 库没有自定义资源并且可以作为 JAR 发布,那么您可以使用以下 build.gradle,即使在 0.5.5 中也可以使用。

// build JAR file
task androidReleaseJar(type: Jar, dependsOn: assembleRelease) 
    from "$buildDir/classes/release/"


apply plugin: 'maven-publish'

publishing 
    publications 
        maven(MavenPublication) 
            artifact androidReleaseJar
        
    

要发布到本地 maven 仓库,请调用以下命令:

gradle publishToMavenLocal

【讨论】:

也许你对how to change the artifactId while using maven-publish .. 有意见? Android 0.5.5 和andoroid.libraryVariants 仍然没有解决方法。 我个人已切换到 android-maven-plugin(请参阅已接受的答案),并且从未回头查看我的答案中描述的解决方法。 对我不起作用。我收到一条错误消息,提示“找不到属性 'bundleRelease'” 我的回答中提出的解决方案现在可能已经过时了。我们在我们的项目中使用android-maven-plugin,它对我们来说很好。【参考方案5】:

我刚刚通过定义上传存档解决了这个问题,如下所述: Gradle documentation 52.6.2. Deploying to a Maven repository

uploadArchives 
  repositories 
    mavenDeployer 
      repository(url: "file://$System.env.HOME/.m2/repository/")
    
  

打电话

gradle uploadArchives

将工件部署到(在我的情况下是本地的)Maven 存储库。 我还没有找到一种简单且更灵活的方法来指定本地 repo 的 url,例如mavenLocal() 但以上满足我的需要。

【讨论】:

谢谢,但我要求 gradle install 而不是 gradle uploadArchives,在我的情况下,它用于将工件实际上传到 Maven 中心。我希望能够在将其发布到 Maven Central 之前安装在本地 maven 存储库中。 这其实不是个好习惯——请参考Peter's answer。

以上是关于Gradle Maven 插件“安装”任务不适用于 Android 库项目的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ① ( Maven 仓库上传源码上传源码设置 | 自定义源码打包任务 | 自定义文档打包任务 )

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ② ( java 和 groovy 插件自带文档任务 | 自定义文档打包任务 | 生成文档包 )

用于 Maven 发布等功能的 Gradle 发布插件

jacoco 插件不适用于 sunfire 插件.. org.apache.maven.surefire.booter.SurefireBooterForkException

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ⑧ ( 设置 Gradle 插件模块 | 将 Gradle 插件上传到自建 Maven 仓库 )

Gradle 简记