使用Gradle将多个现有JAR上载到Maven存储库

Iva*_*rov 6 gradle

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

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

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

理想情况下,我需要像"deployJars"这样的任务,它会上传所有内容并依赖于"downloadTarGz"任务.

更新:

如何在没有附加任何JAR的情况下上传POM?我需要生成几个POM,这些POM依赖于这些动态检测到的JAR并上传它们."artifacts"要求我指定要上传的文件.

Ren*_*hke 15

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

apply plugin:'maven'

configurations{
    allJars
}

artifacts{
    allJars file("path/to/jarFile.jar")
}
Run Code Online (Sandbox Code Playgroud)

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

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

问题是您要上传多个工件.要实现这一点,您需要在构建脚本中使用更多动态.所有发现的jar的动态创建publishartifacts都可以包含在任务中.在我的示例中,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
                }   
            }
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

为了能够在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 
                    }
                }  
            }  
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您只需要在uploadAllJars和configureUploadAllJars之间添加依赖关系:

uploadAllJars.dependsOn configureUploadAllJars    
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助,

欢呼,勒内