【问题标题】:Uploading multiple existing JARs to Maven repository with Gradle使用 Gradle 将多个现有 JAR 上传到 Maven 存储库
【发布时间】:2013-04-27 02:19:08
【问题描述】:

我需要实现一个 Gradle 任务,它将多个现有 JAR 上传到 Maven 存储库。

棘手的部分是事先不知道 JAR 列表。我希望它工作的方式是首先下载某些“.tar.gz”文件,解压它,然后扫描 JAR 并使用某种命名约定上传它们(例如使用 JAR 名称作为 artifactId 和 .tar 的版本。 gz 作为版本)。

使用 Gradle 最简单的方法是什么?目前它是一个简单的 bash 脚本,它搜索 JAR 并为每个 JAR 运行 Maven deploy:deploy-file,但我需要将该功能合并到 gradle 构建脚本中。

理想情况下,我需要像“deployJars”这样的任务,它可以上传所有内容并依赖于“downloadTarGz”任务。

更新:

上传不带任何 JAR 的 POM 怎么样?我需要生成几个依赖于这些动态检测到的 JAR 的 POM 并上传它们。 “工件”要求我指定要上传的文件。

【问题讨论】:

    标签: gradle


    【解决方案1】:

    要通过 gradle 上传 jar,您必须将该 jar 声明为发布工件并使用 artifacts 闭包将其添加到特定配置中:

    apply plugin:'maven'
    
    configurations{
        allJars
    }
    
    artifacts{
        allJars file("path/to/jarFile.jar")
    }
    

    现在您可以配置动态创建的 uploadAllJars 任务:

    uploadAllJars {
       repositories {  
            mavenDeployer {  
                repository(url: 'http://localhost:8081/artifactory/acme') {  
                    authentication(userName: 'admin', password: 'password');  
                }
           }
     }  
    

    问题是您要上传多个工件。为了实现这一点,您需要在构建脚本中增加一些动态。可以将所有发现的 jar 的发布工件的动态创建包装在一个任务中。在我的示例中,discoverAllJars 任务只是在指定文件夹中查找 jar 文件。在这里,您需要实现自己的逻辑来查找 tgz 存档中的 jar。

    group = "org.acme"
    version = "1.0-SNAPSHOT"
    
    task discoverAllJars{
        ext.discoveredFiles = []
        doLast{
            file("jars").eachFile{file ->
                if(file.name.endsWith("jar")){
                    println "found file ${file.name}" 
                    discoveredFiles << file
                    artifacts{
                        allJars file
                    }   
                }
            }   
        }
    }
    

    为了能够在 uploadAllJars 任务中上传多个工件,您必须使用 pom 过滤器。有关 pom 过滤器的详细信息,请查看 http://www.gradle.org/docs/current/userguide/maven_plugin.html#uploading_to_maven_repositories 的 gradle 用户指南

    由于我们将已发布工件的配置移至 gradle 的执行阶段,我们也必须在执行阶段配置 uploadAllJars。因此我会创建一个 configureUploadAllJars 任务。请注意我们如何引用使用 'discoverAllJars.discoveredFiles' 发现的 jar 文件:

     task configureUploadAllJars{
        dependsOn discoverAllJars
        doLast{
            uploadAllJars {
               repositories {  
                    mavenDeployer {  
                        repository(url: 'http://yourrepository/') {  
                            authentication(userName: 'admin', password: 'password');  
                        }
                        discoverAllJars.discoveredFiles.each{discoveredFile ->
                            def filterName = discoveredFile.name - ".jar"
                            addFilter(filterName) { artifact, file ->
                                file.name == discoveredFile.name
                            }
                            pom(filterName).artifactId = filterName 
                        }
                    }  
                }  
            }   
        }
    }
    

    现在你只需要在uploadAllJars和configureUploadAllJars之间添加一个依赖:

    uploadAllJars.dependsOn configureUploadAllJars    
    

    此示例对所有发现的 jar 文件使用相同的组和版本,并将 jar 名称用作 artifactId。您可以使用 pom 过滤机制随意更改它。

    希望有所帮助,

    干杯, 勒内

    【讨论】:

    • 谢谢,勒内!这正是我需要的!我是 Gradle 新手,我不知道您可以在执行期间配置任务。我尝试使用新的“maven-publish”插件进行类似的操作,但它不起作用,因为它不允许在执行期间更改发布。
    • 好的,现在我只能上传“原始”POM(没有附加任何工件)。
    • discoverAllJars 任务不起作用 4 me.it 遇到错误Could not find method artifacts() for arguments
    • 应该添加这个脚本来工作configurations { allJars }
    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2014-10-03
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多