摇篮8.6
我正在尝试使用 Gradle 任务中的 jarsigner 来签署 jar。
keytool -genkey -alias test -validity 3650 -keyalg RSA -keystore test.jks
输入命令后,我设置了密码并指定了所有必要的数据。
C:\Users\User\.gradle\test.jks
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
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
感谢@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
)
}
}