Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle可以将不同的工件上传到不同的Maven Repo吗?_Maven_Gradle_Publishing_Artifactory - Fatal编程技术网

Gradle可以将不同的工件上传到不同的Maven Repo吗?

Gradle可以将不同的工件上传到不同的Maven Repo吗?,maven,gradle,publishing,artifactory,Maven,Gradle,Publishing,Artifactory,我正在使用Gradle2.3和新的maven publish插件 是否可以控制插件,以便它根据项目正在生成的工件类型选择目标repo 我正在使用生成RPM,效果很好。我们还配置了一个Artifactory服务器,既可以作为jar repo,也可以作为yum repo 我可以手动将JAR上载到项目proj dev local,将RPM上载到proj yum local,这对于RPM和JAR的所有依赖项解析都很有效 现在,我想设置Gradle任务来发布这两种类型的工件,每种工件都要发布到Artifa

我正在使用Gradle2.3和新的
maven publish
插件

是否可以控制插件,以便它根据项目正在生成的工件类型选择目标repo

我正在使用生成RPM,效果很好。我们还配置了一个Artifactory服务器,既可以作为jar repo,也可以作为yum repo

我可以手动将JAR上载到项目
proj dev local
,将RPM上载到
proj yum local
,这对于RPM和JAR的所有依赖项解析都很有效

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

我知道Gradle的官方Artifactory插件无法处理多个发布repo,但我认为可以使用
maven publish
插件或其他机制

如果我在一个项目中只有jar工件,在一个单独的项目中只有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包”

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

例如,是否有某种方法可以修改
publishmavenrppublicationtoavenrepository
任务,从而忽略某个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,当我在上述代码片段之后的
子项目
结尾中添加以下代码时,我才能够让所有这些都正常工作

//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
    }
}
此外,您还可以提供回购协议名称,以便任务名称更有意义

maven {
    name = 'yum'
}

不确定逻辑会是什么样子。如果我把上面的
model
code放在闭包
plugins.withType(JavaPlugin)中{
,它将禁用所有包含Java的项目的RPM发布,不是吗?反之亦然。我不希望这样。或者我误解了吗?这是不必要的。Gradle为每个发布/存储库组合创建一个任务。这意味着如果您声明两个发布和两个存储库(正如您在这里所做的那样)您将获得四个发布任务。您可以简单地禁用不想运行的任务。我明白了。但是在
jarproject
中,我无法将任何配置应用于
publishmavenrppublicationtomavenrepository
,因为它不是一个已定义的任务。反之亦然。因此,在
子j中应用上面的
model
子句ects
关闭导致错误
配置项目时出现问题:jarproject'>,以下模型规则未绑定:model.tasks.PublishMavenrpPublicationToEventRepository
我可以尝试先检查任务是否存在,但不确定是否会给它一个机会。我发现一些似乎有效的东西,将其粘贴到我的任务中如果我在
模型
闭包之外执行
enable=false
,它就会起作用。