如何解决JNLP应用程序中的“缺少Codebase、Permissions和Application-Name清单属性”问题?

30

最近Java更新后,很多人在使用Java Web Start应用程序时遇到了缺少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

我该如何修复这个问题?

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
...
(Note:在 Windows 上,我为此编写了一个 .bat 文件。)
完成之后,这些属性应该被写入 .jar 文件中。你可以使用类似 7-Zip 的 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 进行签名!

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

注意二:目前的Netbeans版本仅将 CodebasePermissions 清单属性添加到您的主要 .jar 文件中,而不是您的库。如果您使用Netbeans,则在尝试添加重复清单属性时,jar 实用程序会发出警告。有一个 bug 报告进入队列以解决此问题:https://netbeans.org/bugzilla/show_bug.cgi?id=234231

编辑:最新版本的Netbeans(8.0)现在为您的清单添加了所有三个属性(CodebasePermissionsApplication-Name)。


1
注意:如果“Codebase”属性未指定安全服务器(例如HTTPS),则存在某些风险,即您的代码可能被重新用于中间人攻击方案。请参阅《JAR文件清单属性安全》(在此处引用) 。 - trashgod
你能否建议一下如何处理代码库未知的情况,即我需要在清单中写上 Codebase: *,因为应用程序部署在很多地方。有没有什么方法可以避免警告呢?谢谢。 - norbi771
1
@Amos,不行。这绝对不会更简单。特别是如果你需要每次发布更新时重新打包/重签名你的 .jars 文件。 - ryvantage
1
这个问题在NetBeans 8中修复了吗?如果已经解决,您可以编辑这个很棒的答案,那就太好了:D - nachokk
1
@Johnny,这是针对包含应用程序的.jar文件完成的,这些文件会被部署到服务器上。程序通过一个.jnlp文件启动,该文件会下载到客户端并执行。 - ryvantage
显示剩余6条评论

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> 

第二步:调用更新目标并在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>

+1 -- 如果您提供signjar任务,那将更加酷,因为需要按照https://dev59.com/EmIk5IYBdhLWcg3wBqGW#19659135中的步骤(3)重新执行。 - Fuhrmanator

3

如果错误信息看起来像这样:

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

您可以通过以下方式解决此问题:
  1. 启动 控制面板

  2. 选择 Java 控制面板

  3. 选择 安全 选项卡

  4. 例外网站列表 中,单击 编辑站点列表 按钮

  5. 单击 添加 按钮。

  6. 输入服务器根路径 (例如:https://ibank.cib.hu),然后按 确定

  7. 重新启动浏览器或应用程序。

资源在此处。


4
这并不是真正的解决方案,只是一种忽略问题而非解决问题的方式。关闭电脑也是一种在不解决问题的情况下忽略它的方式。 - ryvantage
2
@ryvantage 这个答案是给终端用户的。 - user669677
我认为这是一个好的解决方案,通常你不希望所有的网站都被信任。 - tuket
@2astalavista,明白了。唯一的问题是,“缺少应用程序名称”消息只是在控制台中出现的警告,而不是用户会看到的错误,除非他们足够聪明地显示控制台。此外:我们不应该建议一个解决方法,让最终用户摆脱安全警告,只因为他们认为它很烦人,即使他们无力彻底解决问题。我不知道Oracle希望通过这个警告得到什么,但它存在是有原因的。 - ryvantage
@ryvantage 如果它只出现在控制台中,我就不会涉及到这个问题。 - user669677

2

添加 manifest 到 jar 并签名 jars 的示例。

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

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提供的建议可能更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接