2013-06-24 3 views
22

Когда я запускаю приложение из JNLP Я получаю сообщениеОтсутствует Codebase манифест атрибут: xxx.jar

"Missing Codebase manifest attribute for:xxx.jar"

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

+0

исчерпывающий ответ на этот вопрос можно найти на этом Q/A: HTTP: // StackOverflow.com/questions/19659134/how-do-i-fix-missing-codebase-permissions-and-application-name-manifest-attri/20501377 # 20501377 – ryvantage

ответ

25

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

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

Ссылка: Oracle's Java 7 documentation

+1

это привело к ошибке для меня: 'java.io.IOException: Invalid сигнатурный файл для основных атрибутов Manifest'. Я добавил строку «Разрешения: все разрешения» и другую «Codebase: (http: // ...)», как вы указали. – ryvantage

+0

@ryvantage, добавьте эти атрибуты перед подписанием файла jar. – Peter

+0

Файл банка создается и подписывается автоматически Netbeans. И создание, и подпись выполняются одним движением. :( – ryvantage

9

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

+0

привет, с качающим приложением, как я могу это сделать? – nachokk

1

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

ПРИЧИНЫ

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

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

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