0

我正在尝试从应该发布到 maven 存储库的单个项目中创建多个 jar,但我似乎无法正确获取工件详细信息。

从我见过的处理sources-jar的示例中,我尝试(动态地)创建几个应该创建每个jar的任务。

def environments = ['local', 'dev', 'test', 'acc', 'prod']

environments.each { e ->
    task "create${e}jar"(type: Jar, dependsOn: classes) << {
       def dir = filterPropertiesForEnv(e)

       from (dir)
       classifier = e
    }

    artifacts.add('archives', tasks["create${e}jar"])
}


File filterPropertiesForEnv(envName) {
    println "filter for $envName"
    def destDir = new File(project.buildDir, envName)

    destDir.mkdir()

    // Do filter stuff based on each envName

    destDir
}

当我运行“安装”任务时,我动态创建的任务“create[name]jar”会运行,但它不会创建任何 jar 文件。如果我删除 doLast-"<<",则构建会生成几个 jar 文件,但 jar 文件是在执行其他所有操作之前构建的(在配置阶段),因此它只包含一个清单文件。

有没有更好的方法来创建多个罐子并将它们附加为工件?我还需要基于相同的模式创建几个 ear-files,其中包含这个 jar,所以找到一个可重用的解决方案会很好。我精通 Maven,但 Gradle 是一个新朋友,我还没有真正掌握如何构造这些问题!

4

2 回答 2

1

在对此事进行更多调查后,我发现如果您向 from-method 添加闭包,则评估将在运行时而不是配置时完成。

一个可行的解决方案是:

def environments = ['local', 'dev', 'test', 'acc', 'prod']

environments.each { e ->
    task "create${e}jar"(type: Jar, dependsOn: classes) << {

       from {
           filterPropertiesForEnv(e)
       }
       classifier = e
    }

    artifacts.add('archives', tasks["create${e}jar"])
}


File filterPropertiesForEnv(envName) {
    println "filter for $envName"
    def destDir = new File(project.buildDir, envName)

    destDir.mkdir()

    // Do filter stuff based on each envName

    destDir
}
于 2013-02-15T20:05:13.637 回答
0

所以你想为每个环境发布一个不同的jar?并使用 uploadArchives 任务发布那些?

最好的方法可能是为每个环境创建一个子项目。这样您就可以为每个子项目设置一个上传任务。从您发布的代码中,您似乎已经在不同目录中拥有不同环境的代码。

如果您正在做一些疯狂的事情,即从一个大型代码库中过滤出不同的文件以尝试为不同的环境创建 Jar 文件,那可能永远不会奏效。

于 2013-02-13T22:46:14.420 回答