如何修复 JNLP 应用程序中“缺少的代码库、权限和应用程序名称清单属性”?

2022-09-01 11:40:32

在最近的 Java 更新中,许多人在 Java Web Start 应用程序缺少 、 和 manifest 属性时遇到了麻烦。虽然有资源可以帮助你做到这一点,但我找不到这个问题的任何全面答案,所以我觉得问答会很好。所以,问题是:CodebasePermissionsApplication-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

(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

当然,无论.jar是什么,都需要指出。您还需要为所有库执行此操作。dist\myApp.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

执行此操作后,应将属性写入 s。您可以在 zip 管理器(如 7-Zip)中打开 .jar,提取文件,在文本编辑器中打开它,您应该会看到列出的属性。.jarMANIFEST.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

之后,应该添加您的属性,并且应该对您的s进行签名!.jar

注意:除非要更改库结构,否则只需对库进行一次签名/部署。也就是说,如果您正在更新应用程序,但库的清单已经更改,正确签名和部署,则无需重新签名/部署库,除非您正在从应用程序中添加/删除库。

注意 #2:当前版本的 Netbeans 将仅将代码库权限清单属性添加到主.jar,而不添加到库中。如果使用 Netbeans,则在尝试添加重复的清单属性时,将从 jar 实用程序收到警告。队列中有一个错误报告,用于修复此 https://netbeans.org/bugzilla/show_bug.cgi?id=234231

编辑:最新版本的 Netbeans (8.0) 现在将这三个 (, 和 ) 添加到清单中。CodebasePermissionsApplication-Name


答案 2

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

步骤 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>

推荐