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

时间:2013-10-29 13:08:31

标签: java java-web-start jnlp

使用最近的Java更新,许多人在使用缺少CodebasePermissionsApplication-name清单属性的Java Web Start应用程序时遇到问题。虽然有资源可以帮助你实现这一目标,但我找不到任何全面这个问题的答案,我觉得Q-and-A会很好。所以,这是问题:

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

如何解决此问题?

5 个答案:

答案 0 :(得分: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文件。)

执行此操作后,应将属性写入.jar。您可以在zip管理器(如7-Zip)中打开.jars,提取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应签名!

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

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

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

答案 1 :(得分: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>

答案 2 :(得分: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. 重新启动浏览器/应用程序。

  8. Resource here.

答案 3 :(得分:2)

如果使用Netbeans,请在文件nbproject / project.properties中设置这些属性:

  • manifest.custom.codebase
  • manifest.custom.permissions
  • manifest.application.name.attribute

最后一个仅由Netbeans&gt; = 8.0支持(参见here)。其他人甚至应该在Netbeans 7.2中工作。我也将jnlp.mixed.code设置为trusted_only但可能在你的情况下不合适。如果无法切换到更新版本的Netbeans,您可以自行修改文件jnlp-impl.xml。

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

答案 4 :(得分: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>