如何通过 Gradle 任务中的 jarsigner 对 jar 进行签名?

问题描述 投票:0回答:1

摇篮8.6

我正在尝试使用 Gradle 任务中的 jarsigner 来签署 jar。

  1. 我做的第一件事就是生成证书:

keytool -genkey -alias test -validity 3650 -keyalg RSA -keystore test.jks

输入命令后,我设置了密码并指定了所有必要的数据。

  1. 我将证书放在Gradle根文件夹中:
    C:\Users\User\.gradle\test.jks
  2. 我还创建并填写了全局
    gradle.properties
    文件:
org.gradle.warning.mode=all
testKeyStore=C:/Users/User/.gradle/test.jks
testKeyStoreAlias=test
testKeyStorePassword=test
testKeyStoreKeyPassword=test
tsa=http://time.certum.pl
  1. 接下来,我创建了一个 Gradle 任务:
tasks.register("signJars") {

    onlyIf { // Skip the task if our secret data isn't available
        project.hasProperty("testKeyStore") &&
                project.hasProperty("testKeyStoreAlias") &&
                project.hasProperty("testKeyStorePassword") &&
                project.hasProperty("testKeyStoreKeyPassword") &&
                project.hasProperty("tsa")
    }

    final def testKeyStore = findProperty("testKeyStore")
    final def testKeyStoreAlias = findProperty("testKeyStoreAlias")
    final def testKeyStorePassword = findProperty("testKeyStorePassword")
    final def testKeyStoreKeyPassword = findProperty("testKeyStoreKeyPassword")
    final def tsa = findProperty("tsa")

    for (jar in fileTree(dir: "$buildDir/libs", include: '*.jar')) {

        final List<String> args = Arrays.asList(
                "jarsigner",
                "-keystore",
                "\"${testKeyStore}\"",
                "-storepass",
                "\"${testKeyStorePassword}\"",
                "-keypass",
                "\"${testKeyStoreKeyPassword}\"",
                "-tsa",
                "\"${tsa}\"",
                "-verbose",
                "\"${jar.toPath()}\"",
                "\"${testKeyStoreAlias}\""
        ) as List<String>

        final command = args.join(" ");
        println command

        def builder = new ProcessBuilder(command)
        builder.inheritIO()
        def process = builder.start()
        def finished = process.waitFor(15, TimeUnit.SECONDS)

        println "Finished: ${finished}"
        println "Exit value: ${process.exitValue()}"
        println "Output: ${process.text}"
    }
}

Gradle Reload 后,我尝试运行该任务,我收到了答案:

Cannot run program "jarsigner -keystore "C:\Users\User\.gradle\test.jks" -storepass "test" -keypass "test" -tsa "http://time.certum.pl" -verbose "E:\full\path\to\project\Project\build\libs\Test.jar" "test"": CreateProcess error=2, The system cannot find the file specified

我尝试了许多不同的变体,但我从未能够使其发挥作用。我需要帮助!

最有趣的是,如果我复制命令并从 Windows PowerShell 或 IDEA 执行它,那么一切都会正常运行!

在尝试执行此任务时,我遵循以下材料: stackoverflow и gist.github

java gradle digital-signature jarsigner jar-signing
1个回答
0
投票

感谢@Robert的回答,我再次提请注意ant

signjar
任务,这次我成功解决了出现的问题。 https://ant.apache.org/manual/Tasks/signjar.html

tasks.register("signJars") {

    onlyIf { // Skip the task if our secret data isn't available
        project.hasProperty("testKeyStore") &&
                project.hasProperty("testKeyStoreAlias") &&
                project.hasProperty("testKeyStorePassword") &&
                project.hasProperty("testKeyStoreKeyPassword") &&
                project.hasProperty("tsa")
    }

    doLast {

        final def testKeyStore = findProperty("testKeyStore")
        final def testKeyStoreAlias = findProperty("testKeyStoreAlias")
        final def testKeyStorePassword = findProperty("testKeyStorePassword")
        final def testKeyStoreKeyPassword = findProperty("testKeyStoreKeyPassword")
        final def tsa = findProperty("tsa")

        ant.signjar(
                destDir: "${layout.buildDirectory.dir("libs").get()}",
                jar: "${layout.buildDirectory.dir("libs").get()}/*.jar",
                alias: testKeyStoreAlias,
                storetype: "jks",
                keystore: testKeyStore,
                storepass: testKeyStorePassword,
                keypass: testKeyStoreKeyPassword,
                tsaurl: tsa,
                verbose: true,
                force: true,
                preservelastmodified: true
        )
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.