如何从gradle jar任务中提取公共代码到方法

时间:2014-11-21 15:28:38

标签: jar gradle build.gradle

我有两个任务nativeJar和native64Jar,manifest和doLast closers对于除文件名之外的任务都是相同的。因此,可以在通用方法中提取该代码并将两个文件名作为方法参数传递,并从两个任务中调用该常用方法,或者从dolast clouser调用该方法。

task nativeJar( type: Jar ) {

        doFirst {

            delete fileTree(dir: "$releaseDir", include: "*.jar")

        }
        baseName = 'NativeLibs'
        destinationDir = new File(releaseDir)
        from files(releaseDir + 'jar_merge/signedNativeLibs')
        manifest {
            attributes 'Permissions' : 'all-permissions',  'Publisher' : 'abc',  'Application-Name' : 'WorkBench', 'Codebase' : '*.abc.com'
        }

        doLast {
            ant.signjar( jar: "$releaseDir/NativeLibs.jar", alias:"WorkBench",  keystore: "WorkBench.jks", signedjar: "$releaseDir/signedNativeLibs.jar", storepass: "freddie" )
        }

    }


    // Create signedNativeLibs64.jar file

    task native64Jar( type: Jar , dependsOn: 'nativeJar' ) {
        baseName = 'NativeLibs64'
        destinationDir = new File(releaseDir)
        from files(releaseDir + 'jar_merge/signedNativeLibs64')
        manifest {
            attributes 'Permissions' : 'all-permissions',  'Publisher' : 'abc',  'Application-Name' : 'WorkBench', 'Codebase' : '*.abc.com'
        }

        doLast {
            ant.signjar( jar: "$releaseDir/NativeLibs64.jar", alias:"WorkBench",  keystore: "WorkBench.jks", signedjar: "$releaseDir/signedNativeLibs64.jar", storepass: "freddie" )
        }

    }

1 个答案:

答案 0 :(得分:1)

我建议将签名拆分为单独的任务,以便从Gradle获得适当的最新检查。正如你现在所拥有的那样,你每次构建时都会对jar进行签名。如果删除已签名的jar,它将再次生成,直到您清理本机jar。

您可以在任务之间共享配置闭包。例如,

[ task1, task2 ].each { task ->
    task.configure {
       // shared closure
    } 
}

我还会遵循一些其他最佳做法。

  • 不要使用新的File(),因为它会使您的脚本依赖于当前的工作目录。
  • 通过任务参考输出而不是重新创建完整路径(例如,您使用$ releaseDir / NativeLibs.jar执行的操作)。 Gradle能够以这种方式推断依赖关系。
  • 使用自定义任务类与adFirst()/ doLast()的临时任务。由于您将所有工作委托给ant任务,因此这应该非常简单。

我不确定为什么你需要你的特定文件名,但我原样离开了它们。如果它们不重要,删除它们会使这更简单。

我对你的例子进行了抨击(免责声明:我没有尝试过):

task nativeJar( type: Jar ) {
    baseName = 'NativeLibs'
    from files(releaseDir + 'jar_merge/signedNativeLibs')
}

task native64Jar( type: Jar ) {
    baseName = 'NativeLibs64'
    from files(releaseDir + 'jar_merge/signedNativeLibs64')
}

[ nativeJar, native64Jar ].each { task ->
    task.configure {
       destinationDir = file(releaseDir)
       manifest {
           attributes 'Permissions' : 'all-permissions',  'Publisher' : 'Financial Engineering',  'Application-Name' : 'WorkBench', 'Codebase' : '*.fhlmc.com'
       }
    }
}

//这个类定义应该放在build.gradle脚本的顶部,否则它将通过注释中提到的异常

class SignJarTask extends DefaultTask {
    @InputFile File inputFile
    @OutputFile File outputFile

    @TaskAction 
    void signJar() {
        ant.signjar( jar: inputFile, alias:"WorkBench",  keystore: "WorkBench.jks", signedjar: outputFile, storepass: "freddie" )
    }
}

task signJar(type: SignJarTask) {
    inputFile = file("$releaseDir/NativeLibs.jar")
    outputFile = file("$releaseDir/signedNativeLibs.jar")
}

task sign64Jar(type: SignJarTask) {
    inputFile = file("$releaseDir/NativeLibs64.jar")
    outputFile = file("$releaseDir/signedNativeLibs64.jar")
}