2012-01-31 2 views
2

Я пытаюсь развернуть приложение JavaFX, но когда я запускаю его в браузере, похоже, что он не может найти классы во внешних файлах jar.JavaFX и внешние JAR

java.lang.RuntimeException: java.lang.ExceptionInInitializerError 

Caused by: java.lang.ExceptionInInitializerError 
at common.bo.property.TextAttributeProp.checkLimit(TextAttributeProp.java:125) 

У меня есть common.jar в папке lib и classpath. Я также использую неограниченный доступ к свойствам проекта. И я также знаю об этой теме JavaFx 2.0 application referencing external jars, но она не будет работать для меня. Все работает нормально, когда я запускаю его из Netbeans. Но в браузере он не будет инициализировать классы во внешних баночках. Не могли бы вы мне помочь. Спасибо

JNLP файл здесь

<?xml version="1.0" encoding="utf-8"?> 
    <jnlp spec="1.0" xmlns:jfx="http://javafx.com" href="JavaFXSklad2.jnlp"> 
    <information> 
    <title>JavaFXSklad2</title> 
    <vendor>xxx</vendor> 
    <description>Sample JavaFX 2.0 application.</description> 
    <offline-allowed/> 
    </information> 
    <resources os="Windows"> 
    <jfx:javafx-runtime version="2.0+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/> 
    </resources> 
    <resources> 
    <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/> 
     <jar href="JavaFXSklad2.jar" size="164987" download="eager" /> 
     <jar href="lib/common.jar" size="965131" download="eager" /> 
     <jar href="lib/ifxjdbc.jar" size="705534" download="eager" /> 
     <jar href="lib/infra.jar" size="588915" download="eager" /> 
    <jar href="lib/jdawt.jar" size="726475" download="eager" /> 
    <jar href="lib/toplink.jar" size="1450414" download="eager" /> 
    <jar href="lib/weblogic.jar" size="55582010" download="eager" /> 
     </resources> 
    <security> 
     <all-permissions/> 
    </security> 
     <applet-desc width="800" height="600" main-class="com.javafx.main.NoJavaFXFallback" name="JavaFXSklad2" /> 
    <jfx:javafx-desc width="800" height="600" main-class="md.MainMenu" name="JavaFXSklad2" /> 
    <update check="background"/> 
    </jnlp> 

Edit> Наконец я понял, что проблема вызвана статическим блоком в классе в банке на этой линии>

String osName= (String) System.getProperties().get("os.name"); 

Я также попробовать подписать внешние баночки и javafx jar с тем же cetrificate, но безуспешно.

+0

Можете ли вы добавить файл '.jnlp', который NetB которые были созданы для вашего проекта JavaFX. –

+0

Я добавляю его на свой пост – troger19

ответ

0

Судя по jnlp, вы не воссоздаете jnlp после включения Unrestricted access. Попробуйте запустить Clean and Build или добавить следующий тег в JNLP вручную:

<security> 
    <all-permissions/> 
</security> 
3

Если вы используете NetBeans 7.1, вам необходимо обновить NetBeans до последней ночной версии http://bits.netbeans.org/download/trunk/nightly/latest/.

В более ранних версиях NetBeans есть файлы для упаковки с ошибкой http://netbeans.org/bugzilla/show_bug.cgi?id=205844.

Вы можете увидеть, есть ли у вашего пакета NetBeans сгенерированный пакет, отменив jar-файлы вашего приложения и установив, что это файл META-INF/MANIFEST.MF содержит ссылки на ваши внешние файлы jar.

Похоже, что используемые вами банки (такие как Toplink, jdbc и WebLogic) требуют привилегий безопасности выше того, что доступно для неподписанного приложения, поэтому вам также необходимо запрашивать дополнительные разрешения безопасности, так как Сергей рекомендует и подписывает ваше приложение , Для этого:

  1. Щелкните правой кнопкой мыши ваш проект в NetBeans.
  2. Выберите Построить | Развертывание
  3. Проверить доступ к неограниченному доступу.
  4. Если у вас есть сертификат подписи из центра сертификации, нажмите кнопку «Изменить ...» рядом с сертификатом подписи, иначе просто примите созданный по умолчанию NetBeans сгенерированный самозаверяющий сертификат.

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


В Java, если статическая инициализация класса выходит из строя, нагрузка класса не удастся завершить, даже если класс доступен и на пути к классу. Это означает, что первая ссылка на класс будет генерировать ExceptionInInitializerError, и последующие ссылки на класс будут генерировать, часто вводящие в заблуждение ClassNotFoundException.

ExceptionInInitializerError указано, что при оценке статического инициализатора или инициализатора для статической переменной возникает исключение. Обнаружен Jar, содержащий файл класса, бросающий ошибку, и загрузка класса началась, но не может быть завершена, потому что в его статических переменных или конструкторах возникли ошибки.

Код подозреваемого будет TextAttributeProp.checkLimit(TextAttributeProp.java:125), хотя основная причина вашей проблемы может быть в другом месте. Проверьте, что делает статический код TextAttributeProp, и оберните методы статической инициализации в блоках try catch, чтобы получить дополнительную информацию об отладке, принять ответное действие или проигнорировать статическую ошибку инициализации.


System.getProperties() не вернет вам свойства, которые вы хотите в неподписанный апплет - это будет просто возвращать нуль. Затем вы пытаетесь разыменовать это значение в статическом инициализаторе, который генерирует исключение NullPointerException и приводит к сбою загрузки класса и последующим ссылкам на класс, чтобы вызвать ClassNotFoundException.

Если вы непосредственно приобрели свойство "os.name" через System.getProperty("os.name"), а не получаете все свойства системы, оно работает, потому что "os.name" не отмечено как чувствительный к безопасности. Чтобы узнать, какие свойства вы можете и не можете запросить у апплета, обратитесь к: http://docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/properties.html. Также обратите внимание, что неподписанный апплет не может устанавливать никаких свойств системы.


Если ваше приложение правильно подписано, вы сможете получить и установить любые требуемые свойства системы. Если вы не можете этого сделать, вы можете подать ошибку против плагина браузера JavaFX по адресу http://javafx-jira.kenai.com. Сначала убедитесь, что вы правильно подписали свое приложение, пытаясь сделать что-то еще, требующее повышенных привилегий, например, прочитать файл из вашей корневой файловой системы из подписанного апплета и убедиться, что чтение не сработает.

+0

Привет. Я устанавливаю новую версию Netbeans из вашей ссылки, но безуспешно. Проблема остается. В манифесте у меня есть ссылки на мои банки, и я также подписываю свое приложение раньше, потому что без подписания я даже не мог заполнять таблицы из данных базы данных. Вот файл манифест> Manifest-Version: 1.0 JavaFX-версия: 2,0 реализации титульный: JavaFXSklad2 реализации версия: 1,0 JavaFX-приложения класс: md.MainMenu JavaFX-Class-Path: Библиотека/common.jar lib/ifxjdbc.jar lib/infra.jar lib/jd awt.jar lib/toplink.jar lib/weblogic.jar Создано: JavaFX Packager – troger19

+0

Обновленный ответ для включения информации о статических ошибках инициализации и о том, как они могут относиться к 'ClassNotFoundException'. – jewelsea

+0

Я думаю, проблема в том, что я не могу получить доступ к свойствам системы из браузера. Этот код находится в статическом блоке в jar 'String osName = (String) System.getProperties(). Get ("os.name"); и потому что osName имеет значение NULL, конструктор не работает. Решение, возможно, связано с файлами jar, я думаю, что я правильно его подписываю, но все же нулевой указатель на System.getProperties и терпит неудачу. – troger19

2

Извините, ребята, я немного вас обманул. Проблема, почему мое приложение работает под Netbeans и в браузере не эту строку в статическом блоке в моем банке:

String osName = (String) System.getProperties().get("os.name"); 

которые возвращают корректное значение в Netbeans (Windows XP), но Null в браузере. Но когда я немного изменил код на это>

String osName = (String) System.getProperty("os.name"); 

он возвращает правильное значение и в браузере. Таким образом, это не имеет ничего общего с внешними банками или подписанием приложения. Проблема все еще сохраняется, потому что внешние банки являются частью нашей инфраструктуры явного Java, поэтому я просто не могу напрямую изменить код, но это будет другая тема :)

0

Я столкнулся с подобными ситуациями .. Я точно не знаю, какое решение это то, что может вам помочь .. поэтому я перечислил их все:

1- убедитесь, что используемая вами банку подписана и подпись действительна. Вы можете использовать jarsigner для этих целей .. потому что, если банки вас используются истек .. приложение будет разбиваться @ web. если есть банка, подписанная и истекшая. просто удалите весь файл из META-INF. (Фляга почтовый файл кстати)

2-я вижу свой JNLP .. вам нужно добавить этот атрибут для класса приложения: основной = «истинного» поэтому ваш будет:

<resources> 
    <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/> 
    <jar href="JavaFXSklad2.jar" main="true" size="164987" download="eager" /> 
    <jar href="lib/common.jar" size="965131" download="eager" /> 
    <jar href="lib/ifxjdbc.jar" size="705534" download="eager" /> 
    <jar href="lib/infra.jar" size="588915" download="eager" /> 
    <jar href="lib/jdawt.jar" size="726475" download="eager" /> 
    <jar href="lib/toplink.jar" size="1450414" download="eager" /> 
    <jar href="lib/weblogic.jar" size="55582010" download="eager" /> 
</resources> 

Его важен сказать приложение, которое является вашим классом приложений .. Я не знаю, почему ..но я нашел эту структуру в предыдущей версии JavaFX, и она решила мою проблему.

3- если вы используете webPage вместо общего, то просто убедитесь, что серийный номер JNLP_content тот же .. потому что каждый раз, когда вы добавляете/удалить банки с проектом, серийные будет изменено .consider проверки URL, а также .. Я имею в виду этот раздел в HTML:

function javafxEmbed() { 
    dtjava.embed(
     { 
      url : 'BSigner_v1.5_release.jnlp', 
      placeholder : 'javafx-app-placeholder', 
      width : 500, 
      height : 100, 
      jnlp_content : 'PD94bWwgd0iYnNwc2lnbmVyX3YxLnBrZzRfcmVsZWFzZS5NYWluIiAgbmFtZT0iQlNQU2lnbmVyX3YxLjVfcmVsZWFzZSIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo=' 
     }, 
     { 
      javafx : '2.2+' 
     }, 
     {} 
    ); 
} 

надежда, что это собирается помочь вам или кто-то сталкивается с тем же вопросом ..

Удачи

Смежные вопросы