Java 缺少:xxx.jar的代码基清单属性

Java 缺少:xxx.jar的代码基清单属性,java,jar,jnlp,Java,Jar,Jnlp,当我从jnlp启动应用程序时,我收到一条消息 “缺少xxx.jar的代码基清单属性” 这意味着什么?在将我的JRE更新为1.7u25后运行内部应用程序时,也遇到了这种情况。出现这些警告是因为1.7u25中引入了新的安全功能,以防止未经授权的代码重用。在我的例子中,我还看到一个对话框,要求我确认我希望应用程序能够访问我的PC 如果您有权访问jar文件,请向其添加两个属性:Permissions和Codebase。您需要确定应用程序是否需要访问PC上的所有内容,在这种情况下,您将使用值all per

当我从jnlp启动应用程序时,我收到一条消息

缺少xxx.jar的代码基清单属性


这意味着什么?

在将我的JRE更新为1.7u25后运行内部应用程序时,也遇到了这种情况。出现这些警告是因为1.7u25中引入了新的安全功能,以防止未经授权的代码重用。在我的例子中,我还看到一个对话框,要求我确认我希望应用程序能够访问我的PC

如果您有权访问jar文件,请向其添加两个属性:
Permissions
Codebase
。您需要确定应用程序是否需要访问PC上的所有内容,在这种情况下,您将使用值
all permissions
作为
permissions
属性。否则,使用
sandbox
,JRE将限制代码在PC上的访问级别。
Codebase
可能需要与jnlp文件的代码库相同,除非该jar文件是从不同的URL下载的,在这种情况下,它需要是该URL


参考资料:

请参阅有关您提到的错误的详细说明

按照Peter的回答,如果您使用的是Netbeans和JavaFX,这就是如何以自动化的方式解决问题

Netbeans 7.3.1仍然没有修复这个“bug”(它没有为您将代码库和权限添加到清单中)。如果希望使用Netbeans构建项目,而不是手动添加缺少的属性(并重新签署.jar),则可以编辑build.xml并添加以下ANT目标和宏:

<target name="-post-jfx-jar">
    <update-libs-manifest />
    <update-jar-manifest jarfile="${jfx.deployment.dir}${file.separator}${jfx.deployment.jar}" />
</target>   

<macrodef name="update-libs-manifest">
    <sequential>
        <property name="pp_rebase_dir" value="${basedir}${file.separator}${dist.dir}${file.separator}lib"/>
        <property name="pp_rebase_fs" value="*.jar"/>

        <condition property="manifest.codebase" value="${manifest.custom.codebase}" else="*">
            <and>
                <isset property="manifest.custom.codebase" />
                <not>
                    <equals arg1="${manifest.custom.codebase}" arg2="" trim="true" />
                </not>
            </and>
        </condition>

        <condition property="manifest.permissions" value="all-permissions" else="sandbox">
            <isset property="permissions-elevated" />
        </condition>

        <echo message="Updating libraries manifest => Codebase: ${manifest.codebase} / Permissions: ${manifest.permissions}" />
        <script language="javascript">
            <![CDATA[
                var dir = project.getProperty("pp_rebase_dir");
                var fDir = new java.io.File(dir);
                if( fDir.exists() ) {
                    var callTask = project.createTask("antcall");
                    callTask.setTarget("-update-jar-macro-call");
                    var param = callTask.createParam();
                    param.setName("jar.file.to.rebase");
                    var includes = project.getProperty("pp_rebase_fs");
                    var fs = project.createDataType("fileset");
                    fs.setDir( fDir );
                    fs.setIncludes(includes);
                    var ds = fs.getDirectoryScanner(project);
                    var srcFiles = ds.getIncludedFiles();
                    for (i=0; i<srcFiles.length; i++) {
                        param.setValue(dir + "${file.separator}" + srcFiles[i]);
                        callTask.perform();
                    }
                }
            ]]>
        </script>
    </sequential>
</macrodef>

<target name="-update-jar-macro-call">
    <update-jar-manifest jarfile="${jar.file.to.rebase}"/>
</target>

<macrodef name="update-jar-manifest">
    <attribute name="jarfile"/>
    <sequential>
        <echo message="jarfile = @{jarfile}" />
        <jar file="@{jarfile}" update="true">
            <manifest>
                <attribute name="Codebase" value="${manifest.codebase}"/>
                <attribute name="Permissions" value="${manifest.permissions}"/>
            </manifest>
        </jar>
    </sequential>
</macrodef>

之后,只需将
manifest.custom.codebase=
添加到project.properties中。例如:
manifest.custom.codebase=localhost


注意:此代码适用于使用Netbeans默认ANT构建过程的JavaFX应用程序。如果不是您的情况,您需要相应地更新它-这需要更改第一个目标(
)、属性名称和检查提升的
权限的条件。
属性。

以下是我的发现:

原因

从Java7Update51开始,Java增强了安全模型,使用户系统不易受到外部攻击。新版本的Java不允许用户运行未签名(未签名)、自签名(未经可信机构签名)和缺少权限属性的应用程序

我在TopCoder竞技场发布时遇到了问题。可使用以下链接轻松删除该文件:


这导致我出错:
java.io.IOException:清单主属性的签名文件摘要无效
。我添加了一行
Permissions:all Permissions
和另一行
Codebase:(http://…)
。@ryvantage,在签署jar文件之前添加这些属性。jar文件由Netbeans自动创建和签署。创建和签名都在一个动作中完成:(我想我可以尝试添加参数,然后手动重新签名.jar。如果您有权访问原始证书,则可以在将属性添加到清单文件后重新签名jar。如果您没有权限访问原始证书,但打算使用自己的证书重新签名,则可以在manifest file,在重新签名jar文件之前删除签名信息。hi,使用swing应用程序如何执行此操作?此问题的全面答案可在以下Q/a中找到: