Java: как создать рабочий.exe из собственного установщика?

У меня есть программа, которую я хочу, чтобы ее мог легко установить любой пользователь, и я подумал, что создание собственного установщика - это путь. Я использовал функциональные возможности Netbeans 8.0 (Свойства проекта> Включить собственную упаковку и Пакет как). Мне удалось создать работающий родной установщик. После установки у меня есть следующее дерево файлов:

+-- Project
    \+-- app
         \+--lib (containing all the jars used by the project)
         \---Project.jar
         \---package.cfg
    \+--runtime
        \+--jre (contains the current jre)
    \---Project.exe

Выполнение программы из Project.jar работает. Однако, когда я пытаюсь запустить Project.exe, я получаю следующее сообщение об ошибке во всплывающем окне без каких- либо подробностей:

Failed due to exception from main class

Чтобы определить источник проблемы, я использовал основные стандартные выходные данные и перенаправил их в файл благодаря командной строке Windows. Я получил результаты до первого звонка во внешнюю библиотеку. Таким образом, кажется, что связывание библиотеки не сделано. Тем не менее, вот содержание моего package.cfg файл:

app.mainjar=Project.jar
app.mainclass=project/Main
app.classpath=lib/firstlibrary.jar lib/secondlibrary.jar 

Путь к классу указан, но, похоже, не распознан. Я попытался инвертировать косую черту (\) и изменить пробелы для , или же ; но безрезультатно.

Существует простой способ воспроизвести ошибку (Netbeans 8.0 и JDK 1.8u11):

  • Создать новый проект Java в Netbeans
  • Свяжите любую внешнюю библиотеку (.jar): щелкните правой кнопкой мыши на Libraries > Add jar/folder
  • В методе main создайте экземпляр объекта, ссылающегося на эту библиотеку.
  • Щелкните правой кнопкой мыши имя проекта> Свойства> Развертывание> Включить действия собственной упаковки в меню проекта.
  • Щелкните правой кнопкой мыши по вашему проекту> Пакет как> Установщик EXE
  • После сборки перейдите в каталог, в котором был создан установщик, и запустите установщик.
  • В конце установки перейдите в каталог установки и запустите.exe. Ошибка должна произойти.

Есть идеи, как это исправить?

3 ответа

Решение

У меня просто была похожая проблема с приложением JavaFX в нативном пакете, где я получал ошибку "Ошибка из-за исключения из основного класса". Мой package.cfg выглядел так же, как ваш.

Что я сделал для диагностики, так это просто вручную запустил файл jar (например, Project.jar) из командной строки и увидел, что такое трассировка стека, например, если ваш класс Main был в org.project.Project

java -cp Project.jar org.project.Project

Оказывается для меня, что URL-адреса, которые я использовал для загрузки различных файлов (например, файлов FXML для JavaFX), упакованных в банку, вызывали проблемы - я использовал относительные URL-адреса (например, "./blah.ext" или "../foo.txt"и т. д.), но как только я изменил URL-адреса на абсолютные, в зависимости от того, как файлы были размещены в банке, все работало нормально (например,"/org/project/blah.ext"и"/org/foo. текст").

Та же проблема здесь, используя эти:

  • Java SE версии 8, обновление 31 (сборка 1.8.0_31-b13)
  • NetBeans 8.0.2 (исправление 1)
  • Windows 7 Enterprise SP1 на Intel Core i7 (64-разрядная версия)
  • Inno Setup Compiler 5.5.5 (u) - Юникод

Я также отслеживал вывод путем перенаправления printlns, и он взорвался при первом обращении к внешней библиотеке. Я подумал, что у меня та же проблема, что и у matt1, поэтому я исправил все относительные пути, но без радости. Я наконец понял, что установщик не создает папку / app / lib с внешними файлами jar. После ручного копирования папки lib в целевую установочную папку она работала нормально, даже на машине без JRE (я работаю над автономным приложением).

Исправление состояло в том, чтобы добавить строку в build.xml:

   <target name="-post-jfx-deploy">
   <fx:deploy width="${javafx.run.width}" height="${javafx.run.height}" 
             nativeBundles="all"
             outdir="${basedir}/${dist.dir}" outfile="${application.title}">
      <fx:application name="${application.title}" mainClass="${javafx.main.class}"/>
      <fx:resources>
          <fx:fileset dir="${basedir}/${dist.dir}" includes="*.jar"/>
          <!--below is the magic bit that copies all the dependency jar files to the native package output-->
          <fx:fileset dir="${basedir}/${dist.dir}" includes="lib/*.jar"/>
      </fx:resources>
      <fx:info title="MyApp" vendor="MyVendor"/>
  </fx:deploy>          
</target>

Вторая директива fileset вызывает копию зависимостей jar из папки lib, в которой все исправлено при развертывании в виде EXE или MSI.

Я думаю, что ваш основной класс неправильно настроен на пакет. Вместо использования Netbeans вы можете сделать exe из вашего jar-файла, используя exe4J.(Пожалуйста, убедитесь, что основной класс установлен в project > properties > run > main class

скачать exe4J отсюда

Другие вопросы по тегам