Подтвердить что ты не робот

Отсутствует атрибут манифеста Codebase для: xxx.jar

Когда я запускаю приложение из jnlp, я получаю сообщение

"Missing Codebase manifest attribute for:xxx.jar"

что это значит?

4b9b3361

Ответ 1

Просто столкнулся с этим при запуске внутреннего приложения после обновления моей JRE до 1.7u25. Предупреждения появляются из-за новой функции безопасности, введенной в 1.7u25, для предотвращения повторного использования неавторизованного кода. В моем случае мне также был представлен диалог с просьбой подтвердить, что я хочу, чтобы приложение имело доступ к моему компьютеру.

Если у вас есть доступ к файлу jar, добавьте к нему два атрибута: Permissions и Codebase. Вам нужно решить, требует ли приложение доступ ко всему на ПК, и в этом случае вы должны использовать значение all-permissions для атрибута Permissions. В противном случае используйте sandbox, и JRE ограничит уровень доступа к коду на ПК. Codebase, вероятно, должен быть таким же, как и кодовая база для файла jnlp, если только этот файл jar не загружается с другого URL-адреса, и в этом случае это должен быть этот URL-адрес.

Ссылка: Документация Oracle Java 7

Ответ 2

После ответа Питера, как вы решаете проблему автоматическим способом, если вы используете 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

Внимание: этот код предназначен для приложения JavaFX с использованием процесса сборки по умолчанию ANT Netbeans. Вам нужно будет обновить его соответствующим образом, если это не ваш случай - для этого потребуется изменение для первой цели (<target name="-post-jfx-jar">), имена свойств и условие, которое проверяет свойство permissions-elevated.

Ответ 4

Вот что я нашел:

ПРИЧИНА

Начиная с версии Java 7 Update 51, у Java улучшенная модель безопасности, чтобы сделать систему пользователей менее уязвимой для внешних эксплойтов. Новая версия Java не позволяет пользователям запускать приложения, которые не подписаны (не подписаны), самоподписанные (не подписанные доверенными полномочиями) и приложениям, которые не имеют атрибутов разрешений.

У меня возникла проблема с запуском TopCoder Arena. Его можно легко удалить, используя следующую ссылку:

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