私はGradleプロジェクトを持っていますmaven-publisherプラグインを使用して、AndroidライブラリをMavenローカルにインストールし、 Mavenリポジトリ。
それは機能しますが、生成されたpom.xmlには依存関係情報は含まれません。その情報を含める回避策はありますか、またはmavenプラグインに戻り、必要なすべての手動設定を行う必要がありますか?
調査して、依存関係の場所をパブリケーションに伝えていないことに気付き、出力/アーティファクトのみを指定しているため、これをリンクする方法が必要です MavenPublication
、しかし、私はまだその方法をドキュメントで見つけていません。
--------------------------------------------- --------------- Gradle 1.10 ----------------------- ------------------------------------- ビルド時間: 2013-12-17 09:28:15 UTC ビルド番号:なし リビジョン:36ced393628875ff15575fa03d16c1349ffe8bb6 Groovy:1.8.6 アント: 2013年7月8日にコンパイルされたApache Ant(TM)バージョン1.9.2 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セクション
//...
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:
<?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>
<artifactId>my-Android-sdk</artifactId>
<version>gradle-SNAPSHOT</version>
<packaging>aar</packaging>
</project>
この問題を回避するには、pom.withXml
を使用してスクリプトに依存関係を直接pomに追加させます。
//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ソリューションをアップグレードしました。この例では、たとえば、リリースまたはデバッグバージョン(debugCompileとreleaseCompile)に異なる依存関係を使用する場合、コンパイル構成からの依存関係と特別なビルドタイプの依存関係を含むpom.xmlを生成します。また、除外を追加します
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では、implemention
を置き換えるためにcompile
が導入されました。代わりにこれを使用してください。
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)
}
}
guide にあるように、from components.Java
ディレクティブと関係があると思います。同様の設定があり、パブリケーションブロックに行を追加することで違いが生じました。
publications {
mavenJar(MavenPublication) {
artifactId 'rest-security'
artifact jar
from components.Java
}
}