2015-03-03 2 views
4

Я использую Gradle для создания проекта библиотеки Android и развертывания его в репозитории maven как aar.Недостатки библиотеки Android в POM с Gradle

В библиотеке есть несколько зависимостей, которые должны быть включены в POM

С apply plugin: 'maven' нет файла POM не присутствует, просто артефакт

С apply plugin: 'maven-publish' генерируется POM файл, но он не включает в себя какой-либо Зависимости

Любые идеи? Это просто не поддерживается?

Gradle 2,2 и Android Gradle Plugin 1.1.0

Первый подход:

configurations { 
    archives { 
     extendsFrom configurations.default 
    } 
} 

afterEvaluate { project -> 
    uploadArchives { 

     configuration = configurations.archives 

     repositories { 
      mavenDeployer { 
       repository(url: "http://nexus-url") { 
        authentication(userName: nexusUsername, password: nexusPassword) 

       pom.groupId = 'com.example' 
       pom.version = '123-SNAPSHOT' 
       pom.artifactId = 'foo' 
       pom.packaging = 'aar' 

       pom.project { 
        artifactId = 'bar' 
        packaging 'aar' 
        description 'baz' 
      } 
     } 
    } 
} 

Также пробовал без упаковки его в afterEvaluate

Второй подход:

Обновление

Основной причиной проблемы является то, что в этом проекте используются ароматизаторы. Без ароматизаторов ПОМ генерируется должным образом при использовании apply plugin: 'maven'

ответ

10

Это решение, которое работало для меня в конце концов:

publishing { 
    publications { 
     sdk(MavenPublication) { 
      artifactId libName 
      artifact "${project.buildDir}/outputs/aar/${libName}-${project.version}.aar" 

      //The publication doesn't know about our dependencies, so we have to manually add them to the pom 
      pom.withXml { 
       // for dependencies and exclusions 
       def dependenciesNode = asNode().appendNode('dependencies') 
       configurations.compile.allDependencies.withType(ModuleDepend‌​ency) { ModuleDependency dp -> 
        def dependencyNode = dependenciesNode.appendNode('dependency') 
        dependencyNode.appendNode('groupId', dp.group) 
        dependencyNode.appendNode('artifactId', dp.name) 
        dependencyNode.appendNode('version', dp.version) 

        // for exclusions 
        if (dp.excludeRules.size() > 0) { 
         def exclusions = dependencyNode.appendNode('exclusions') 
         dp.excludeRules.each { ExcludeRule ex -> 
          def exclusion = exclusions.appendNode('exclusion') 
          exclusion.appendNode('groupId', ex.group) 
          exclusion.appendNode('artifactId', ex.module) 
         } 
        } 
       } 
      } 
     } 
    } 

    repositories { 
     maven { 
      name 'myrepo' 
      url 'https://maven.foo.com' 

      credentials { 
       username mavenUsername 
       password mavenPassword 
      }  
     } 
    } 
} 
+1

Лучше заменить 'configurations.compile.allDependencies.each' на' configurations.compile.allDependencies.withType (ModuleDependency) ', чтобы избежать исключений, когда вы используете 'compile fileTree (dir: 'libs', include: ['* .jar'])' –

0

попробовать mavenDeployer: http://gradle.org/docs/current/userguide/maven_plugin.html

uploadArchives { 
    repositories { 
     mavenDeployer { 
      repository(url: "file://localhost/tmp/myRepo/") 
      pom.version = '1.0Maven' 
      pom.artifactId = 'myMavenName' 
     } 
    } 
} 

здесь вы можете установить детали POM. Вы получите новый гол под названием uploadArchives. Когда он выполняется, он развертывается с заданным репо.

+0

Остерегайтесь SNAPSHOT-зависимостями, Gradle не следует этой концепции Maven, то есть при развертывании SNAPSHOT-зависимостей, Gradle не будет обновлять их если он уже получил ту же версию (AFAIK) – sschrass

+0

, спасибо, но это на самом деле то, что я имел в виду, когда я упомянул «применить плагин:« maven'' Я отправлю код для обоих вариантов –

+0

Нужно было снова это прочитать -> вы не хочу зависимостей в этом помпе. Для этого нет оснований, потому что ваши зависимости запекаются в артефакт. Это то, что делает компиляция. Этот pom - это просто описание вашего артефакта. – sschrass