随着最近的Java更新,许多人在Java Web Start应用程序缺少Codebase
,Permissions
和Application-name
清单属性时遇到了问题。虽然有资源可以帮助你做到这一点,但我找不到这个问题的任何全面答案,所以我觉得问答会很好。所以,这里有一个问题:
我的 Java Web Start 应用程序在控制台中显示以下警告:
Missing Permissions manifest attribute for: http://www.codebase.com/myApp/dist/myApp.jar
Missing Codebase manifest attribute for: http://www.codebase.com/myApp/dist/myApp.jar
Missing Application-Name manifest attribute for: http://www.codebase.com/myApp/dist/myApp.jar
我该如何解决这个问题?
(1) 首先,您需要创建一个包含要添加的所有属性的文本文件。我的文本文件如下所示:
Permissions: all-permissions
Codebase: http://www.codebase.com/myApp/dist
Application-Name: My Application
我把它命名为addToManifest.txt
。显然,您需要更改参数以满足应用程序的需求。
(2)接下来,您需要将其添加到主.jar和所有库中。执行此操作的命令是:
jar ufm distmyApp.jar addToManifest.txt
当然,distmyApp.jar
需要指出你的主要.jar是什么。您还需要为所有库执行此操作。
jar ufm distlibjcommon-1.0.16.jar addToManifest.txt
jar ufm distlibjfreechart-1.0.13.jar addToManifest.txt
jar ufm distlibjoda-time-2.2.jar addToManifest.txt
...
(注意:在Windows上,我为此编写了一个.bat
文件。
完成此操作后,应将属性写入.jar
。您可以在zip管理器(如7-Zip)中打开.jars,提取MANIFEST.MF
文件,在文本编辑器中打开它,您应该会看到列出的属性。
(3) 添加属性后,需要重新签名应用。执行此操作的命令是:
jarsigner distmyApp.jar -keystore "C:myAppKEYSTORE.ks" alias -storepass password
您还需要为所有库执行此操作:
jarsigner distlibjcommon-1.0.16.jar -keystore "C:myAppKEYSTORE.ks" alias -storepass password
jarsigner distlibjfreechart-1.0.13.jar -keystore "C:myAppKEYSTORE.ks" alias -storepass password
jarsigner distlibjoda-time-2.2.jar -keystore "C:myAppKEYSTORE.ks" alias -storepass password
之后,应该添加您的属性并对您的.jar
进行签名!
注意:除非更改库结构,否则只需对库进行一次签名/部署。 也就是说,如果要更新应用,但库的清单已更改、正确签名和部署,则无需重新签名/部署库,除非您要从应用中添加/删除库。
注意 #2:当前版本的 Netbeans 将仅将Codebase
和Permissions
清单属性添加到主.jar,而不添加到库中。如果使用 Netbeans,则在尝试添加重复清单属性时,jar
实用程序将收到警告。队列中有一个错误报告,用于此修复 https://netbeans.org/bugzilla/show_bug.cgi?id=234231。
编辑:最新版本的Netbeans(8.0)现在添加了所有三个(Codebase
,Permissions
和Application-Name
)到清单中。
另一种方法是在构建脚本本身中处理它。
步骤 1:定义要更新的目标
<target name="updateManifest">
<manifest file="${file}" mode="update">
<attribute name="Trusted-Only" value="true"/>
<attribute name="Permissions" value="all-permissions"/>
<attribute name="Codebase" value="*"/>
</manifest>
</target>
步骤 2:调用更新目标并在 jar 中使用新清单
<ant target="updateManifest">
<property name="file" location="manifest.use" />
</ant>
<jar jarfile="${jar_name}.jar" manifest="manifest.use">
<fileset dir="${dest}">
<include name="File1" />
</fileset>
</jar>
如果错误消息如下所示:
Missing Application-Name manifest attribute for: server root/filename.jar
你可以这样解决它:
开始
control panel
选择
Java Control Panel
选择"
Security
"选项卡Exception Site list
点击Edit Site List
按钮点击
Add
按钮。键入服务器根目录(例如:https://ibank.cib.hu),然后按
OK
重新启动浏览器/应用程序。
资源在这里。
如果使用 Netbeans,请在文件 nbproject/project.properties 中设置这些属性:
- manifest.custom.codebase
- manifest.custom.permissions
- manifest.application.name.attribute
最后一个仅受 Netbeans>= 8.0 支持(请参阅此处)。其他的即使在 Netbeans 7.2 中也应该可以工作。我也将jnlp.mixed.code设置为trusted_only,但也许它不适合您的情况。如果您无法切换到更新版本的 Netbeans,则可以修改文件 jnlp-impl.xml风险自负。
atulsm的建议最好不要使用Netbeans。
用于将manifest
添加到 jar 和签名 jar 的示例。
<target name="-post-compile">
<jar destfile="${build.web.dir}/jars/app.jar" >
<fileset dir="${build.classes.dir}">
<include name="com/sample/test/client/**/*.*"/>
<include name="com/sample/test/share/**/*.*"/>
</fileset>
<manifest>
<attribute name="Author" value="${user.name}"/>
<attribute name="Permissions" value="all-permissions"/>
<attribute name="Codebase" value="http://localhost:8080/app/"/>
<attribute name="Application-Name" value="App"/>
</manifest>
</jar>
<signjar keystore="app.keystore" storepass="test" jar="${build.web.dir}/jars/app.jar" alias="tomcat" />
<copyfiles files="${file.reference.javadatepicker.jar}" todir="${build.web.dir}/jars"/>
<delete dir="${build.web.dir}/WEB-INF/classes/com/sample/app/client"/>
<!--keytool -genkey -alias tomcat -keystore app.keystore -keypass test -storepass test -validity 1960-->
<signjar keystore="app.keystore" storepass="test" jar="${build.web.dir}/jars/javadatepicker.jar" alias="tomcat" />
</target>