【发布时间】:2013-07-25 01:06:52
【问题描述】:
我想将一些使用 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
但是,我的工件 jar 具有第三方依赖项(例如 slf4j),我还没有找到一种直观的方法将这些属性包含在此类第三方 jar 中。考虑到这一点,我最终的 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 不会抱怨我的工件,但会抱怨第三方 jar,因为它们的清单文件中显然没有属性:
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'
)
谢谢!
【问题讨论】:
-
经过长时间的搜索,这是我能找到的第一个示例,其中实际显示了如何在 gradle 中的 ant jar 任务调用中的清单元素中设置属性。在 gradle 网站上,有人问了这个问题,他们反而展示了一个 gradle manifest 元素的例子,而不是 ant 的例子,这完全不相关。终于在这里找到答案了,谢谢。
标签: java security gradle java-web-start