我想将一些使用Gradle 1.6构建的jar文件捆绑为Java webstart应用程序的一部分。
我目前可以使用证书正确签名jar,并使用标准jar任务指定生成工件的codebase
和permissions
属性,如下所示:
jar {
manifest.attributes provider: 'tribe7.net'
manifest.attributes permissions: 'all-permissions'
manifest.attributes codebase: '*'
}
这是因为Oracle JDK / JRE中最新的Java webstart版本强制要求这些属性,否则它会向用户抱怨应用程序的安全性。
Preventing RIAs from Being Repurposed
但是,我的工件罐有第三方依赖(例如,slf4j),我还没有找到一种直观的方法将这些属性包含在这样的第三方罐中。考虑到这一点,我的最终webstart应用程序结构看起来像这样:
./build/webstart/my.jnlp
./build/webstart/lib/myartifactA-1.00.jar
./build/webstart/lib/myartifactB-1.00.jar
./build/webstart/lib/myartifactC-1.00.jar
./build/webstart/lib/slf4j-api-1.7.5.jar
结果是,在运行时,webstart不会抱怨我的工件,但会对第三方罐子这样做,因为他们显然没有清单文件中的属性:
Missing Codebase manifest attribute for: file:/C:/build/webstart/lib/slf4j-api-1.7.5.jar
Missing Permissions manifest attribute for: file:/C:/build/webstart/lib/slf4j-api-1.7.5.jar
Missing Codebase manifest attribute for: file:/C:/build/webstart/lib/slf4j-simple-1.7.5.jar
Missing Permissions manifest attribute for: file:/C:/build/webstart/lib/slf4j-simple-1.7.5.jar
由于我不直接控制第三方jar的清单生成,因此我必须以某种方式修改build/webstart/lib
目录中的清单文件,以明确包含这些属性,以使webstart满意。
有没有办法使用Gradle向jar文件的清单添加属性?如果有人感兴趣,这是我的Gradle构建脚本:
感谢您的时间和帮助!
更新
彼得的回答奏效了!这是更新的代码:
ant.jar(destfile: it, update: true) {
delegate.manifest {
attribute(name: 'permissions', value: 'all-permissions')
attribute(name: 'codebase', value: '*')
}
}
ant.signjar(
destDir: webstartSignedLibPath,
alias: project.getProperty('jarsign.keystore.alias'),
jar: it,
keystore: project.getProperty('jarsign.keystore.path'),
storepass: project.getProperty('jarsign.keystore.password'),
preservelastmodified: 'true'
)
谢谢!
答案 0 :(得分:4)
要设置这些属性,您必须解压缩Jars,编辑清单(使用Groovy),然后重新打包Jars。或者,您可以尝试使用ant.jar(update = true)
覆盖清单,但似乎不支持覆盖文件(不添加副本)(请参阅Ant docs中的duplicate
属性)。合并罐子(以某种方式)可能是另一种选择。