JavaFX и внешние JAR-файлы - PullRequest
       9

JavaFX и внешние JAR-файлы

2 голосов
/ 31 января 2012

Я пытаюсь развернуть приложение 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 и путь к классам.Я также использую неограниченный доступ в свойствах проекта.И я также знаю об этой теме Приложение JavaFx 2.0, ссылающееся на внешние jar , но оно не будет работать для меня.Все работает нормально, когда я запускаю его из 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>

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

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

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

Ответы [ 4 ]

3 голосов
/ 01 февраля 2012

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

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

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

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

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

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


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

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

Подозреваемый код будет TextAttributeProp.checkLimit(TextAttributeProp.java:125), хотя rootпричина вашей проблемы может быть в другом месте.Проверьте, что делает статический код 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 .Сначала проверьте, правильно ли вы подписали приложение, пытаясь сделать что-то еще, что требует повышенных привилегий, например, прочитать файл из корневой файловой системы из подписанного апплета и убедиться, что чтение не завершилось неудачей.

2 голосов
/ 06 февраля 2012

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

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

, которая возвращает правильное значение в NetBeans (Windows Xp), но в браузере - Null.Но когда я немного изменяю код на этот>

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

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

0 голосов
/ 13 июня 2013

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

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

2-я вижу ваш JNLP .. вам нужно добавить этот атрибут для класса приложения: main = "true", чтобы вы были:

<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 такой же ... потому что каждый раз, когда вы добавляете / удаляете jar-файлы в проект, серийный номер также изменяется.

 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+'
        },
        {}
    );
}

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

Удачи

0 голосов
/ 31 января 2012

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

<security>
  <all-permissions/>
</security>
...