30

随着最近的 Java 更新,许多人在他们的 Java Web Start 应用程序缺少CodebasePermissionsApplication-namemanifest 属性时遇到了麻烦。尽管有资源可以帮助您完成此任务,但我找不到这个问题的任何全面答案,所以我觉得问答会很好。那么,问题来了:

我的 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

我该如何解决?

4

5 回答 5

41

(1)首先,您需要创建一个包含您要添加的所有属性的文本文件。我的文本文件如下所示:

Permissions: all-permissions
Codebase: http://www.codebase.com/myApp/dist
Application-Name: My Application

我命名它addToManifest.txt。显然,您需要更改参数以满足应用程序的需求。

(2)接下来,您需要将其添加到主 .jar 和所有库中。执行此操作的命令是:

jar ufm dist\myApp.jar addToManifest.txt

当然dist\myApp.jar需要指出你的主要 .jar 是什么。您还需要对所有库执行此操作。

jar ufm dist\lib\jcommon-1.0.16.jar addToManifest.txt
jar ufm dist\lib\jfreechart-1.0.13.jar addToManifest.txt
jar ufm dist\lib\joda-time-2.2.jar addToManifest.txt
...

(注意:在 Windows 上,我为此编写了一个.bat文件。)

完成此操作后,应将属性写入.jars. 您可以在 zip 管理器(如 7-Zip)中打开 .jar,解压缩MANIFEST.MF文件,在文本编辑器中打开它,您应该会看到列出的属性。

(3)添加属性后,您需要为您的应用程序退出。执行此操作的命令是:

jarsigner dist\myApp.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password

您还需要为所有库执行此操作:

jarsigner dist\lib\jcommon-1.0.16.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password
jarsigner dist\lib\jfreechart-1.0.13.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password
jarsigner dist\lib\joda-time-2.2.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password

之后,你的属性应该被添加并且你.jar的 s 应该被签名!

注意:除非您更改库结构,否则您只需签署/部署您的库一次。即,如果您正在更新您的应用程序,但库已经更改、正确签名和部署了它们的清单,则除非您从应用程序中添加/删除库,否则您不需要重新签名/部署库。

注意 #2:当前版本的 Netbeans 只会将属性添加CodebasePermissions您的主 .jar中,但不会添加到您的库中。jar如果您使用 Netbeans,当您尝试添加重复的清单属性时,您将收到来自实用程序的警告。队列中有一个错误报告以修复此问题https://netbeans.org/bugzilla/show_bug.cgi?id=234231

编辑:最新版本的 Netbeans (8.0) 现在为您将所有三个(Codebase、、PermissionsApplication-Name)添加到清单中。

于 2013-10-29T13:08:31.207 回答
9

另一种方法可能是在您的构建脚本本身中处理它。

第 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>
于 2013-10-30T06:16:31.000 回答
3

如果错误消息如下所示:

Missing Application-Name manifest attribute for: server root/filename.jar

你可以这样解决它:

  1. 开始control panel

  2. 选择Java Control Panel

  3. 选择Security选项卡

  4. Exception Site list点击Edit Site List按钮

  5. 点击Add按钮。

  6. 输入服务器根目录(例如:https ://ibank.cib.hu ),然后按OK

  7. 重新启动您的浏览器/应用程序。

资源在这里。

于 2014-01-23T08:32:48.650 回答
2

如果您使用 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 的风险。

如果您不使用 Netbeans,atulsm 的建议会更好。

于 2015-04-17T12:59:49.580 回答
2

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>
于 2016-05-16T07:27:33.870 回答