23

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

" Missing Codebase manifest attribute for:xxx.jar"

这是什么意思?

4

4 回答 4

25

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

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

参考:Oracle 的 Java 7 文档

于 2013-06-24T18:03:53.657 回答
10

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

Netbeans 7.3.1 仍然没有修复这个“错误”(它不会为您将代码库和权限添加到清单中)。如果您想使用 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=<your_codebase>到您的 project.properties。例如:manifest.custom.codebase=localhost

注意:此代码适用于使用 Netbeans 默认 ANT 构建过程的 JavaFX 应用程序。如果不是您的情况,您需要相应地更新它 - 这将需要更改第一个目标 ( <target name="-post-jfx-jar">)、属性名称和检查permissions-elevated属性的条件。

于 2013-09-25T20:09:26.343 回答
2

请参阅有关您提到的错误的详细说明。http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/no_redeploy.html

于 2013-07-26T09:15:58.923 回答
1

这是我发现的:

原因

从 Java 7 Update 51 开始,Java 增强了安全模型,使用户系统不易受到外部攻击。新版 Java 不允许用户运行未签名(Unsigned)、自签名(未由受信任的权威机构签名)的应用程序以及缺少权限属性的应用程序。

我在 TopCoder Arena 发布时遇到了问题。可以使用以下链接轻松删除它:

http://www.java.com/en/download/help/java_blocked.xml

于 2014-01-16T14:31:04.073 回答