maven - Gradle 可以将不同的 Artifact 上传到不同的 Maven 存储库吗?

标签 maven gradle publishing artifactory

我正在使用 Gradle 2.3 和新的 maven-publish插入。

是否可以控制插件,使其根据项目生成的 Artifact 类型选择目标存储库?

我正在使用 'os-package' plugin 生成 RPM ,效果很好。我们还配置了一个 Artifactory 服务器,作为 jar 存储库和 yum 存储库。

手动可以上传jar到项目proj-dev-local和 rpm 到 proj-yum-local ,它适用于 rpm 和 jar 的所有依赖项解析。

现在,我想设置 Gradle 任务来发布这两种类型的 Artifact ,每一种都发布到 Artifactory 中的正确 repo。

我知道 Gradle 的官方 Artifactory 插件无法处理多个发布存储库,但我认为应该可以使用 maven-publish插件,或其他一些机制。

如果我在一个项目中只有 jar Artifact ,而在一个单独的项目中只有 rpm,我可以使用以下根项目的配置轻松(嗯...)让它工作。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath (group: 'com.netflix.nebula', name: 'gradle-ospackage-plugin', version: '2.0.3')
    }
}

apply plugin: 'java'
version = '0.1.1'

subprojects {
    apply plugin: 'maven-publish'
    version = parent.version
    plugins.withType(JavaPlugin) {
        publishing {
            publications {
                mavenJava(MavenPublication) {
                    from components.java
                    repositories {
                        maven {
                            url "https://url/artifactory/proj-dev-local"
                        }
                    }
                }
            }
        }
    }
    plugins.matching {it.class.name == "com.netflix.gradle.plugins.packaging.CommonPackagingPlugin"}.all {
        ospackage {
            vendor = 'myCompany'
        }
        publishing {
            publications {
                mavenRpm(MavenPublication) {
                    artifact buildRpm //buildRpm is a task added by the os-package plugin
                    repositories {
                        maven {
                            url "https://url/artifactory/proj-yum-local"
                        }
                    }
                }
            }
        }
    }
}

然而,这不是我的软件项目的本质——Rpm 项目几乎都是 java 项目。
在下面的测试用例中,我有两个子项目,jarproject仅适用于 'java' 插件和 rpmproject它适用于“java”和“os-package”。

rpmproject ,我在我的 yum repo 中发布了 jar,反之亦然。

例如,是否有某种方法可以修改 publishMavenRpmPublicationToMavenRepository任务,所以它忽略了某个 repo ?
$ gradlew publish  
:jarproject:generatePomFileForMavenJavaPublication  
:jarproject:compileJava UP-TO-DATE
:jarproject:processResources UP-TO-DATE
:jarproject:classes UP-TO-DATE
:jarproject:jar UP-TO-DATE
:jarproject:publishMavenJavaPublicationToMavenRepository
Uploading: test/jarproject/0.1.1/jarproject-0.1.1.jar to repository remote at https://url/artifactory/proj-dev-local
Transferring 0K from remote
Uploaded 0K
:jarproject:publish
:rpmproject:generatePomFileForMavenJavaPublication
:rpmproject:compileJava UP-TO-DATE
:rpmproject:processResources UP-TO-DATE
:rpmproject:classes UP-TO-DATE
:rpmproject:jar UP-TO-DATE
:rpmproject:publishMavenJavaPublicationToMaven2Repository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.jar to repository remote at https://url/artifactory/proj-dev-local
Transferring 0K from remote
Uploaded 0K
:rpmproject:publishMavenJavaPublicationToMavenRepository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.jar to repository remote at https://url/artifactory/proj-yum-local
Transferring 0K from remote
Uploaded 0K
:rpmproject:buildRpm UP-TO-DATE
:rpmproject:generatePomFileForMavenRpmPublication
:rpmproject:publishMavenRpmPublicationToMaven2Repository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.rpm to repository remote at https://url/artifactory/proj-dev-local
Transferring 2K from remote
Uploaded 2K
:rpmproject:publishMavenRpmPublicationToMavenRepository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.rpm to repository remote at https://url/artifactory/proj-yum-local
Transferring 2K from remote
Uploaded 2K
:rpmproject:publish

BUILD SUCCESSFUL

编辑:
感谢 Mark Vieira,当我在 subprojects 中添加以下代码时,它能够正常工作。关闭,在上面的代码片段之后。
//Disable rpm publishing to jar repo and vice versa
gradle.taskGraph.whenReady { 
    try {
    tasks.getByPath("${project.getPath()}:publishMavenRpmPublicationToDevRepository").enabled = false;
    } catch (UnknownTaskException e) {
    }
    try {
    tasks.getByPath("${project.getPath()}:publishMavenJavaPublicationToYumRepository").enabled = false;
    } catch (UnknownTaskException e) {
    }
}

我仍然希望看到一种更美观的方式,因此欢迎提供进一步的答案,但至少这个解决方案对我有用。

最佳答案

您可以禁用该特定发布任务。

model {
    tasks.publishMavenRpmPublicationToMavenRepository {
        enabled = false
    }
}

此外,您可以给您的 repos 名称,以便任务名称更有意义。
maven {
    name = 'yum'
}

关于maven - Gradle 可以将不同的 Artifact 上传到不同的 Maven 存储库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721350/

相关文章:

maven - 如何克服这些 maven/m2eclipse 问题

Android Studio 3.6.1 构建问题

python - 可以以编程方式创建电子书吗?

sitecore - 我们如何在 sitecore 中针对一种特定语言取消发布项目及其子项目?

asp.net - 如何在不编译、不复制SVN文件的情况下发布完整的网站

java - 通过 Maven 部署 Solr 到 Tomcat

java - Apache Pivot - 启动应用程序时出现 SerializationException

android - 外部AAR依赖项中损坏的proguard.txt(非ASCII字符)

java - gradle - 项目作为依赖项

json - ClassNotFoundException : org. apache.commons.lang.xwork.StringUtils 与 Struts2 - JSON - JQuery