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

How do I fix "missing Codebase, Permissions, and Application-Name manifest attribute" in my JNLP app?

提问人:ryvantage 提问时间:10/29/2013 最后编辑:ryvantage 更新时间:5/23/2016 访问量:76925

问:

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

My 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

我该如何解决这个问题?

Java java-web-start jnlp (英语

评论


答:

41赞 ryvantage 10/29/2013 #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

之后,应该添加您的属性并签名!.jar

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

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

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

评论

1赞 trashgod 10/30/2013
“注意:如果该属性未指定安全服务器,例如 HTTPS,则存在一些风险,即您的代码可能会被重新用于中间人 (MITM) 攻击方案。”另请参阅此处引用的 JAR 文件清单属性Codebase
0赞 norbi771 11/15/2013
您能否就如何处理代码库未知的情况提供建议,即我需要在清单中拥有 Codebase: *,因为应用程序部署在许多地方。有什么方法可以避免警告吗?谢谢。
1赞 ryvantage 2/4/2014
@Amos,没有。这绝对不会更简单。特别是当您每次发布更新时都需要重新打包/重新签署 .jar 时。
1赞 nachokk 4/12/2014
这在 NetBeans 8 中是固定的吗?如果你编辑这个伟大的答案,如果它被解决了,那就太好了:D
1赞 ryvantage 8/12/2014
@johnny,这是在包含部署到服务器的应用程序的文件上完成的。该程序通过下载到客户端并执行的文件启动。.jar.jnlp
9赞 Atul Soman 10/30/2013 #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>

评论

0赞 Fuhrmanator 7/19/2014
+1 -- 如果您提供 signjar 任务会更酷,因为这需要(重新)完成,如 stackoverflow.com/a/19659135/1168342 的步骤 (3) 所示
3赞 user669677 1/23/2014 #3

如果错误消息如下所示:

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

你可以这样解决它:

  1. 开始control panel

  2. 选择Java Control Panel

  3. “选择”选项卡Security

  4. 点击按钮Exception Site listEdit Site List

  5. 点击按钮。Add

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

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

资源在这里。

评论

4赞 ryvantage 2/6/2014
这并不是一个真正的解决方案。这只是一种忽视问题的方法,而不是解决问题的方法。关闭计算机将是忽略问题而不解决问题的另一种方法。
2赞 2/10/2014
@ryvantage这个答案是针对最终用户的。
0赞 tuket 5/5/2014
我认为这是一个很好的解决方案,通常您不希望所有网站都受到信任。
0赞 ryvantage 5/9/2014
@2astalavista,明白了。唯一的问题是,该消息是仅出现在控制台中的警告,而不是对用户来说明显的错误,除非他们足够聪明地显示控制台。此外:我们应该不愿意提出一种解决方法,以便最终用户可以仅仅因为他们认为这是一个麻烦而摆脱安全警告,即使他们无力彻底解决问题。我不知道甲骨文希望这个警告是什么,但它的存在是有原因的。Missing Application-Name
0赞 5/9/2014
@ryvantage如果它只出现在控制台中,我就不会卷入这个问题。
2赞 gouessej 4/17/2015 #4

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

  • manifest.custom.代码库
  • manifest.custom.权限
  • manifest.application.name.attribute

只有 Netbeans >= 8.0 支持最后一个版本(请参阅此处)。其他的甚至在 Netbeans 7.2 中也应该可以工作。我也将 jnlp.mixed.code 设置为trusted_only,但可能它不适合您的情况。如果无法切换到更新版本的 Netbeans,则可以自行承担修改文件 jnlp-impl.xml 的风险。

atulsm 的建议最好不使用 Netbeans。

2赞 nikli 5/16/2016 #5

用于添加到 jar 和签名 jar 的示例。.manifest

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