2016-03-06 2 views
1

Я использую инструмент Oracle «Self-Contained Application Packaging», чтобы сделать файл .deb для настольного приложения JavaFX 8. Сгенерированный файл пакета может быть установлен без проблем на Ubuntu, но затем приложение не запускается. Файл устанавливается следующим образом:JavaFX DEB Bundle Without JRE не работает

$ sudo dpkg -i vocabhunter-1.0.14.deb 

Однако попытки запустить приложение генерирует следующее сообщение об ошибке:

$ /opt/VocabHunter/VocabHunter 
VocabHunter Failed to locate JNI_CreateJavaVM 
VocabHunter Failed to launch JVM 

Важно отметить, что я генерации сверток без JRE включены и исследования, кажется, что проблема связана с этим. Созданный файл /opt/VocabHunter/app/VocabHunter.cfg содержит следующую строку:

app.runtime= 

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

sudo sed -i "s|app.runtime=.*|app.runtime=$JAVA_HOME|g" /opt/VocabHunter/app/VocabHunter.cfg 

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

В сборке используется Gradle для вызова скрипта Ant для создания пакета. Gradle заполняет все необходимые переменные. Ant скрипт выглядит следующим образом:

<project name="VocabHunter Packaging" basedir="" 
     xmlns:fx="javafx:com.sun.javafx.tools.ant"> 
    <property environment="env"/> 
    <property name="JAVA_HOME" value="${env.JAVA_HOME}"/> 
    <target name="jfxbundle" description="Build the application bundle"> 
     <taskdef resource="com/sun/javafx/tools/ant/antlib.xml" 
       uri="javafx:com.sun.javafx.tools.ant" 
       classpath="${JAVA_HOME}/lib/ant-javafx.jar"/> 
     <fx:deploy outdir="${basedir}/build" 
        nativeBundles="${packageType}"> 
      <fx:platform basedir=""/> 
      <fx:application id="VocabHunterId" 
          name="VocabHunter" 
          mainClass="${mainClass}" 
          version="${version}"/> 
      <fx:resources> 
       <fx:fileset dir="${basedir}/build/libs"/> 
      </fx:resources> 
      <fx:info title="VocabHunter"> 
       <fx:association description="VocabHunter session" 
           extension="wordy" 
           mimetype="application/x-vnd.VocabHunterSession" 
           icon="${sessionIcon}"/> 
      </fx:info> 
      <fx:bundleArgument arg="icon" 
           value="${appIcon}"/> 
      <fx:bundleArgument arg="mac.CFBundleVersion" 
           value="${version}"/> 
      <fx:bundleArgument arg="launcher-cfg-format" 
           value="prop"/> 
     </fx:deploy> 
    </target> 
</project> 

Вы можете увидеть полный сценарий в контексте here.

Я тестирую это с помощью JDK 1.8.0_92 на Ubuntu 14.04.

+1

Это может быть тем же самым, как и в [моем вопросе ] (http://stackoverflow.com/questions/32795309/linux-executable-fails-using-javafx-maven-plugin). Также рассмотрите два отчета об ошибках https://bugs.openjdk.java.net/browse/JDK-8143314 и https://bugs.openjdk.java.net/browse/JDK-8143934. Последнее должно быть разрешено с помощью 8u76. – hotzst

+0

Hi @hotzst. Спасибо за ссылку на вопрос. Конечно, это похоже на то, что сообщения об ошибках похожи.Я не понимаю после прочтения вашего ответа, что вы сделали, чтобы решить проблему. Можете ли вы предложить, как я могу применить то, что вы сделали для решения этой проблемы? – Adam

+0

Первый шаг - определить, является ли проблема с исполняемым банком или пусковой установкой. Для этого выполните jar-файл с помощью java -jar ... '. Если это пусковая установка, это может быть связано с конфигурацией. В моем случае файл cfg не может быть разрешен, поскольку он вычисляется из имени приложения, которое содержит '.'. Для исполняемого файла Linux не требуется, чтобы определенный суффикс файла был исполняемым, Windows делает это. – hotzst

ответ

1

Чтобы ответить на этот вопрос, вы должны установить JRE_HOME для запуска какой-либо собственной пусковой установки JavaFX без подключения JRE. В Windows он заглянет в реестр и ищет HKLM\Software\JavaSoft\Java Runtime Environment\[CurrentVersion]\JavaHome. Я не мог найти документацию об этом.

Чтобы обойти это, вам необходимо «обновить» значение app.runtime как часть выполняемого при установке кода postinst. Что-то вроде этого:

#!/bin/sh 
# postinst script for APPLICATION_NAME 
# 
# see: dh_installdeb(1) 

set -e 

# summary of how this script can be called: 
#  * <postinst> `configure' <most-recently-configured-version> 
#  * <old-postinst> `abort-upgrade' <new version> 
#  * <conflictor's-postinst> `abort-remove' `in-favour' <package> 
#   <new-version> 
#  * <postinst> `abort-remove' 
#  * <deconfigured's-postinst> `abort-deconfigure' `in-favour' 
#   <failed-install-package> <version> `removing' 
#   <conflicting-package> <version> 
# for details, see http://www.debian.org/doc/debian-policy/ or 
# the debian-policy package 

case "$1" in 
    configure) 
     echo Adding shortcut to the menu 
SECONDARY_LAUNCHERS_INSTALL 
APP_CDS_CACHE 
     xdg-desktop-menu install --novendor /opt/APPLICATION_FS_NAME/APPLICATION_LAUNCHER_FILENAME.desktop 
FILE_ASSOCIATION_INSTALL 

     if [ "SERVICE_HINT" = "true" ]; then 
      echo Installing daemon 
      cp /opt/APPLICATION_FS_NAME/APPLICATION_PACKAGE.init /etc/init.d/APPLICATION_PACKAGE 

      if [ -x "/etc/init.d/APPLICATION_PACKAGE" ]; then 
       update-rc.d APPLICATION_PACKAGE defaults 

       if [ "START_ON_INSTALL" = "true" ]; then 
        if which invoke-rc.d >/dev/null 2>&1; then 
         invoke-rc.d APPLICATION_PACKAGE start 
        else 
         /etc/init.d/APPLICATION_PACKAGE start 
        fi 
       fi 
      fi 

     fi 

     if [ -f /etc/profile ]; then 
      # load special environment variables 
      . /etc/profile 

      # remove stored value in case of dpkg-reconfigure 
      RUNTIME_PATH_TO_SET="" 

      if [ -z "$JRE_HOME" ]; then 
       echo JRE_HOME is not set, checking for JAVA_HOME being set 
       if [ -z "$JAVA_HOME" ]; then 
        echo JAVA_HOME is not set, checking for known locations 

        # look for known locations 
        KNOWN_JDK_DIRS="/usr/lib/jvm/java-8-oracle /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-8-openjdk-i386" 
        FOUND_JAVA_HOME="" 

        # Look for the right JVM to use (use the first one) 
        for potentialjdkdir in $KNOWN_JDK_DIRS; do 
         if [ -r "$potentialjdkdir/bin/java" -a -z "$FOUND_JAVA_HOME" ]; then 
          FOUND_JAVA_HOME="$potentialjdkdir" 
         fi 
        done 

        if [ -z "$FOUND_JAVA_HOME" ]; then 
         # still nothing found :(
         echo Please make sure to have Java installed and JRE_HOME variable set before running APPLICATION_LAUNCHER_FILENAME 
        else 
         echo Updating runtime-settings using known location 
         RUNTIME_PATH_TO_SET="$FOUND_JAVA_HOME" 
        fi 
       else 
        echo Updating runtime-settings using JAVA_HOME 
        # JAVA_HOME is set, use that value 
        RUNTIME_PATH_TO_SET="$JAVA_HOME" 
       fi 
      fi 

      # always write runtime-location, as it might get removed again when user calls dpkg-reconfigure 
      sed -i "s|app.runtime=.*|app.runtime=$RUNTIME_PATH_TO_SET|g" /opt/APPLICATION_FS_NAME/app/APPLICATION_LAUNCHER_FILENAME.cfg 
     fi 
    ;; 

    abort-upgrade|abort-remove|abort-deconfigure) 
    ;; 

    *) 
     echo "postinst called with unknown argument \`$1'" >&2 
     exit 1 
    ;; 
esac 

# dh_installdeb will replace this with shell code automatically 
# generated by other debhelper scripts. 

#DEBHELPER# 

exit 0 

При использовании JavaFX-Maven-плагин или JavaFX-Gradle-плагин, поместите этот скрипт в src/main/deploy/package/linux с именем файла postinst получить подхвачена javapackager/Bundler.

Отказ от ответственности: Я сопровождающий javafx-maven-plugin и создатель javafx-gradle-plugin

EDIT: обновленного скрипта для работы на dpkg-reconfigure слишком

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