带有 -dname 的 keytool 包含 Gradle 中的空格:非法选项



我正在尝试创建一个涉及Java keytool二进制文件的任务,但显然我无法正确传递dname参数。空格似乎是问题所在,但只有在作为 Gradle 脚本运行时。当我将相同的命令复制粘贴到终端中时,它可以工作。(我相信在这两种情况下都使用相同的键工具二进制文件。

这是我的脚本:

task generateTomcatKeystore() {
doLast {
def serverAlias = "server_debug"
def serverStorePass = "changeit_server"
def serverKeyPass = "changeit_server"
def ourDomain = "domain.net"
def ourName = "Company"
def dName = /CN=$ourDomain, OU=Backend, O=$ourName, L=Prague, S=Czech Republic, C=CZ/
def keytoolCommand = /keytool -genkeypair -alias $serverAlias -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -dname "$dName" -validity 365 -keypass $serverKeyPass -keystore tomcat.jks -storepass $serverStorePass/;
// what exactly am I executing?
println keytoolCommand
def outputErr = keytoolCommand.execute().err.text
// errors?
println outputErr
// am I calling the right binary? ...apparently yes
println 'which keytool'.execute().text
}
}

这是我收到的投诉:

Illegal option:  OU=Backend,

当我像这样消除 dname 组件之间的所有空格时:

def dName = /CN=$ourDomain,OU=Backend,O=$ourName,L=Prague,S=Czech Republic,C=CZ/

错误更改为:

Illegal option:  Republic,C=CZ"

。很明显,空间是问题所在。但只有当从 Gradle 内部运行时。

请注意,我的 -dname 用双引号括起来:

keytool -genkeypair -alias server_debug -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -dname "CN=domain.net,OU=Backend,O=Company,L=Prague,S=Czech Republic,C=CZ" -validity 365 -keypass changeit_server -keystore tomcat.jks -storepass changeit_server

根据 Oracle 的说法,在 dname 参数中只需要转义逗号,请自行查看。

在引擎盖下,groovy 在java.lang.String中添加了一个 execute(( 方法,可以将字符串拆分为数组。它可能通过拆分空格字符来做到这一点。参见 String.execute((

我建议你改用 Gradle 的 Project.exec(Closure(。你可以做类似的事情

ByteArrayOutputStream errorOut = new ByteArrayOutputStream() 
exec {
workingDir = "$javaHome/bin" 
errorOutput = errorOut
args "keytool -genkeypair -alias $serverAlias -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -dname".split(' ') 
args dName
args "-validity 365 -keypass $serverKeyPass -keystore tomcat.jks -storepass $serverStorePass".split(' ') 
} 
String errors = errorOut.toString()

最新更新