Gradle not including dependencies in published pom.xml
我有一个Gradle项目,我正在使用maven-publisher插件将我的android库安装到maven local和一个maven repo。
可以,但是生成的pom.xml不包含任何依赖项信息。 是否有解决方法可以包含该信息,还是我被迫回到maven插件并完成所需的所有手动配置?
经过研究,我意识到我没有告诉出版物依赖项在哪里,我只指定了输出/工件,因此我需要一种方法将此
1 2 3 4 5 6 7 8 9 10 11 12 13 | ------------------------------------------------------------ Gradle 1.10 ------------------------------------------------------------ Build time: 2013-12-17 09:28:15 UTC Build number: none Revision: 36ced393628875ff15575fa03d16c1349ffe8bb6 Groovy: 1.8.6 Ant: Apache Ant(TM) version 1.9.2 compiled on July 8 2013 Ivy: 2.2.0 JVM: 1.7.0_60 (Oracle Corporation 24.60-b09) OS: Mac OS X 10.9.2 x86_64 |
相关的build.gradle部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | //... apply plugin: 'android-library' apply plugin: 'robolectric' apply plugin: 'maven-publish' //... repositories { mavenLocal() maven { name"myNexus" url myNexusUrl } mavenCentral() } //... android.libraryVariants publishing { publications { sdk(MavenPublication) { artifactId 'my-android-sdk' artifact"${project.buildDir}/outputs/aar/${project.name}-${project.version}.aar" } } repositories { maven { name"myNexus" url myNexusUrl credentials { username myNexusUsername password myNexusPassword } } } } |
生成的pom.xml:
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>org.example.android</groupId> my-android-sdk</artifactId> <version>gradle-SNAPSHOT</version> <packaging>aar</packaging> </project> |
我可以通过使脚本直接使用
1 2 3 4 5 6 7 8 9 10 11 12 | //The publication doesn't know about our dependencies, so we have to manually add them to the pom pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each configurations.compile.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } } |
这适用于我的项目,可能会对其他人产生无法预料的后果。
我正在升级C.Ross解决方案。本示例将使用编译配置中的依赖项以及特殊的构建类型依赖项生成pom.xml,例如,如果您将不同的依赖项用于发行版或调试版本(debugCompile和releaseCompile)。而且还增加了排他性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | publishing { publications { // Create different publications for every build types (debug and release) android.buildTypes.all { variant -> // Dynamically creating publications name "${variant.name}Aar"(MavenPublication) { def manifest = new XmlSlurper().parse(project.android.sourceSets.main.manifest.srcFile); def libVersion = manifest['@android:versionName'].text() def artifactName = project.getName() // Artifact properties groupId GROUP_ID version = libVersion artifactId variant.name == 'debug' ? artifactName + '-dev' : artifactName // Tell maven to prepare the generated"*.aar" file for publishing artifact("$buildDir/outputs/aar/${project.getName()}-${variant.name}.aar") pom.withXml { //Creating additional node for dependencies def dependenciesNode = asNode().appendNode('dependencies') //Defining configuration names from which dependencies will be taken (debugCompile or releaseCompile and compile) def configurationNames = ["${variant.name}Compile", 'compile'] configurationNames.each { configurationName -> configurations[configurationName].allDependencies.each { if (it.group != null && it.name != null) { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) //If there are any exclusions in dependency if (it.excludeRules.size() > 0) { def exclusionsNode = dependencyNode.appendNode('exclusions') it.excludeRules.each { rule -> def exclusionNode = exclusionsNode.appendNode('exclusion') exclusionNode.appendNode('groupId', rule.group) exclusionNode.appendNode('artifactId', rule.module) } } } } } } } } } } |
随着gradle 3
改用它。
1 2 3 4 5 6 7 8 9 | pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') configurations.implementation.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } } |
Kotlin DSL版本接受的答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | create<MavenPublication>("maven") { groupId ="com.example" artifactId ="sdk" version = Versions.sdkVersionName artifact("$buildDir/outputs/aar/Example-release.aar") pom.withXml { val dependenciesNode = asNode().appendNode("dependencies") val configurationNames = arrayOf("implementation","api") configurationNames.forEach { configurationName -> configurations[configurationName].allDependencies.forEach { if (it.group != null) { val dependencyNode = dependenciesNode.appendNode("dependency") dependencyNode.appendNode("groupId", it.group) dependencyNode.appendNode("artifactId", it.name) dependencyNode.appendNode("version", it.version) } } } } } |
我猜它与
1 2 3 4 5 6 7 | publications { mavenJar(MavenPublication) { artifactId 'rest-security' artifact jar from components.java } } |
现在不建议使用编译,我们必须使用实现。
1 2 3 4 5 6 7 8 | pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') configurations.implementation.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } |
我使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | apply plugin 'maven-publish' publications { mavenAar(MavenPublication) { from components.android } mavenJava(MavenPublication) { pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') // Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each configurations.api.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } } } } |
我希望它对寻求使用