Ho un progetto che ha un modulo SharedCode
(Java) e in secondo luogo un modulo Android
(libreria Android) che dipende dal modulo SharedCode
. Voglio pubblicare un artefatto jar
dal modulo SharedCode
e un artefatto aar
dal modulo Android
. Non riesco a capire come comporre i miei file build.gradle
in modo che entrambi i moduli vengano pubblicati su Artifactory quando viene eseguita l'attività artifactoryPublish
. Al momento solo il modulo SharedCode
pubblica il suo artefatto su Artifactory.Plugin Artifactory Gradle - Come pubblicare artefatti da più moduli in un progetto?
I miei file build.gradle
sono i seguenti. Si noti che l'aspetto maven-publish
dei miei file build.gradle
sembra essere corretto perché quando eseguo l'attività publishToMavenLocal
vedo le risorse da entrambi i moduli nella mia cartella Maven locale (ad esempio '~/.m2/repository'
).
In primo luogo, il file build.gradle
nel mio modulo SharedCode
è la seguente:
apply plugin: 'java'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'
group = "${projectGroupId}"
version = "${projectVersionName}"
dependencies {
compile 'com.google.guava:guava:18.0'
}
publishing {
publications {
SharedCode(MavenPublication) {
groupId "${projectGroupId}"
artifactId 'SharedCode'
version "${projectVersionName}"
from components.java
}
}
}
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('SharedCode')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
In secondo luogo, il file build.gradle
nel mio modulo Android
è la seguente:
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'
group = "${projectGroupId}"
version = "${projectVersionName}"
android {
// android stuff here...
}
dependencies {
compile project(':SharedCode')
}
publishing {
publications {
Android(MavenPublication) {
groupId "${projectGroupId}"
artifactId 'Android'
version "${projectVersionName}"
artifact "$buildDir/outputs/aar/Android-release.aar"
}
}
}
artifactory {
contextUrl = "${artifactory_url}"
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_username}"
password = "${artifactory_password}"
}
defaults {
publications('Android')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
Se eseguo il compito artifactoryPublish
alla radice, al livello del progetto o al livello del modulo SharedCode
, quindi visualizzo l'output nel modo seguente:
18:23:38: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:SharedCode:generatePomFileForSharedCodePublication
:SharedCode:artifactoryPublish
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.jar
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.pom
Deploying build descriptor to: http://localhost:8081/artifactory/api/build Build successfully deployed.
Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375019604
BUILD SUCCESSFUL
Si noti che solo la risorsa SharedCode
è pubblicata in questo caso.
Se eseguo il compito artifactoryPublish
a livello di modulo Android
, poi vedo uscita come segue:
18:25:25: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:Android:artifactoryPublish
Deploying build descriptor to: http://localhost:8081/artifactory/api/build
Build successfully deployed. Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375127269
BUILD SUCCESSFUL
Si noti che senza artefatti sono pubblicati in questo caso.
Qual è la struttura delle cartelle dei moduli? Hai condiviso e Android in una terza cartella principale? Puoi mostrare anche le tue impostazioni. – RaGe
Sì, ho una cartella radice che ha un file 'build.gradle' a livello di progetto che non ha nulla di sostanziale in questo momento diverso dalle dichiarazioni di classpath. E sotto quella cartella ho una cartella 'Android' e una' SharedCode' che rappresentano rispettivamente una libreria Android e un modulo Java. I file 'build.gradle' per questi due moduli sono come nella mia domanda sopra. (Grazie per il tuo aiuto btw @RaGe. Apprezzo davvero.) –
Il mio file 'settings.gradle' ha queste tre linee: (1)' rootProject.name = 'client-sdk''; (2) 'include ': Android''; (3) 'include ': SharedCode''. –