Java “我该如何解决?”;缺少代码库、权限和应用程序名称清单属性“;在我的JNLP应用程序中?

Java “我该如何解决?”;缺少代码库、权限和应用程序名称清单属性“;在我的JNLP应用程序中?,java,java-web-start,jnlp,Java,Java Web Start,Jnlp,随着最近的Java更新,许多人在Java Web Start应用程序缺少Codebase,权限,以及应用程序名清单属性时遇到了麻烦。虽然有资源可以帮助您完成这项任务,但我找不到任何全面的答案,所以我觉得问答会很好。所以,问题是: 我的Java Web Start应用程序在控制台中显示以下警告: Missing Permissions manifest attribute for: http://www.codebase.com/myApp/dist/myApp.jar Missing Codeb

随着最近的Java更新,许多人在Java Web Start应用程序缺少
Codebase
权限
,以及
应用程序名
清单属性时遇到了麻烦。虽然有资源可以帮助您完成这项任务,但我找不到任何全面的答案,所以我觉得问答会很好。所以,问题是:

我的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)首先,您需要创建一个包含所有要添加属性的文本文件。我的文本文件如下所示:

Permissions: all-permissions
Codebase: http://www.codebase.com/myApp/dist
Application-Name: My Application
Missing Application-Name manifest attribute for: server root/filename.jar
我把它命名为
addToManifest.txt
。显然,您需要更改参数以满足应用程序的需要

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

jar ufm dist\myApp.jar addToManifest.txt
当然,
dist\myApp.jar
需要指向main.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
s。您可以在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
进行签名

注意:除非更改库结构,否则只需对库进行一次签名/部署。i、 例如,如果您正在更新应用程序,但库的清单已被更改、正确签名和部署,则您无需退出/部署库,除非您正在从应用程序中添加/删除库

注意#2:当前版本的Netbeans将只向primary.jar添加
Codebase
Permissions
清单属性,而不是库。如果使用Netbeans,当您尝试添加重复的清单属性时,将从
jar
实用程序收到警告。队列中有一个bug报告要修复此问题


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

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

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

如果错误消息如下所示:

Permissions: all-permissions
Codebase: http://www.codebase.com/myApp/dist
Application-Name: My Application
Missing Application-Name manifest attribute for: server root/filename.jar
您可以通过以下方式解决此问题:

  • 启动
    控制面板

  • 选择Java控制面板

  • 选择
    Security
    选项卡

  • 异常站点列表
    点击
    编辑站点列表
    按钮

  • 单击添加按钮

  • 键入服务器根目录(例如:),然后按
    OK

  • 重新启动浏览器/应用程序


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

    • manifest.custom.codebase
    • manifest.custom.permissions
    • manifest.application.name.attribute
    最后一个仅受Netbeans>=8.0支持(请参阅)。其他的应该在Netbeans 7.2中也能工作。我也将jnlp.mixed.code设置为trusted_,但可能不适合您的情况。如果无法切换到更新版本的Netbeans,则可以修改文件jnlp-impl.xml,风险自负


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

    向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>
    
    
    
    “注意:如果
    Codebase
    属性未指定安全服务器,如HTTPS,则存在代码可能被重新用于中间人(MITM)攻击方案的风险。”另请参阅引用的JAR文件清单属性以获取安全性。您能否就如何处理代码库未知的情况提出建议,例如,我需要在清单中有代码库:*因为应用程序部署在许多地方。有没有办法避免警告?谢谢。@Amos,不。那肯定不会更简单。尤其是当您每次发布更新时都需要重新打包/退出.jar时。这在netbeans 8中是否已修复??如果你能编辑这个伟大的答案,如果它被解决了,那就太好了:D@johnny,这是在包含部署到服务器的应用程序的
    .jar
    文件上完成的。程序是通过下载到客户端并执行的
    .jnlp
    文件启动的。这不是真正的解决方案。这只是一种忽视问题的方式,而不是解决问题。关闭计算机将是忽略问题而不解决问题的另一种方式。@ryvantage此答案面向最终用户。我认为这是一个很好的解决方案,通常您不希望所有站点都被信任。@2astalavista,明白了。唯一的问题是,
    缺少应用程序名称
    消息是一个仅出现在控制台中的警告,而不是一个将向用户显示的错误,除非用户足够聪明来显示控制台。进一步:我们不愿意提出一个解决方案,以便