Как лучше всего запускать Java-приложения в Windows 7? - PullRequest
36 голосов
/ 17 февраля 2012

Требования

Я хочу опубликовать приложение Java с графическим интерфейсом в Windows 7. Это приложение использует Swing Toolkit и не нуждается в собственном коде. Приложение устанавливается с помощью установщика NSIS . Я хочу как можно лучше интегрировать это приложение в Windows 7. Это значит:

  • Когда приложение работает, должна быть возможность закрепить приложение на панели задач.
  • Должно быть возможно связать файлы данных с приложением, чтобы Windows открывала эти файлы с моим приложением.
  • Должен автоматически работать с 32-битной средой выполнения Java и с 64-битной средой выполнения Java. Поэтому, когда пользователь удаляет 32-битную Java и вместо нее устанавливает 64-битную Java (или наоборот), мое приложение все равно должно работать.
  • Должен поддерживать настройку больших шрифтов Windows. Я не очень понимаю эту особенность. Я просто знаю, что некоторые приложения игнорируют его полностью, другие (например, Google Chrome) масштабируются в пикселях (выглядит очень некрасиво), а другие поддерживают его, просто используя более крупные шрифты, как и предполагалось (это то, что я хочу, и обычно это работает. Только решение WinRun4J упомянутое ниже не работает с этим).

Проверенные решения

WinRun4J

WinRun4j - это файл EXE, который запускает приложение Java. Поскольку приложение не создает новый процесс Java, Windows считает, что файл EXE является приложением. Таким образом, нет проблем с панелью задач. Файловые ассоциации работают, потому что файлы могут быть просто связаны с файлом EXE.

Проблемы:

  • Не поддерживает большие шрифты. Вместо этого окно приложения масштабируется в пикселях (например, Google Chrome).
  • В зависимости от установленного JRE должны использоваться два разных EXE-файла. Поэтому, когда установлена ​​64-битная JRE, приложение должно быть запущено с 64-битным EXE-файлом. Когда установлены 32-битные модули JRE, необходимо использовать другой EXE-файл. Это не удобно для пользователя, потому что пользователь не понимает, почему он должен использовать 32-битный EXE в 64-битной операционной системе, когда установлена ​​только 32-битная JRE.

Launch4J

Launch4J создает 32-разрядный EXE-файл, который запускает внешний процесс Java для запуска приложения Java. Таким образом, в отличие от WinRun4J, он также может запускать 64-битную Java.

Проблемы:

  • Невозможно закрепить приложение на панели задач.
  • System.out.println не будет печатать на консоли, если headerType="gui", независимо от того, запущено ли приложение с консоли.

JAR

В Windows вы можете просто дважды щелкнуть файл JAR, чтобы запустить приложение. Установленная JRE не имеет значения, просто работает. Но ...

Проблемы:

  • Приложение не может быть закреплено на панели задач.
  • Невозможно создать ярлык в меню «Пуск».
  • Невозможно связать файлы с файлом JAR.

BAT / CMD

Простой пакетный файл, подобный этому, может использоваться для запуска приложения:

@echo off
start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1

Для этого пакетного файла можно создать ярлык для установки пользовательского значка.

Проблемы:

  • При запуске приложения появляется окно DOS.
  • Пакетный файл не знает, где находится javaw.exe. В зависимости от того, какая версия Java (32- или 64-разрядная) установлена, она может находиться вместо c:\windows\syswow64, и Windows не перенаправляет этот вызов из пакетных файлов автоматически. Использование переменной среды JAVA_HOME также не допускается, поскольку Java не устанавливает это автоматически.
  • При связывании файлов с командным файлом пользовательский значок установить нельзя.
  • Поддержка панели задач не работает должным образом. Приложение может быть прикреплено к нему, когда пакетный файл запускается вручную, но если вместо этого дважды щелкнуть соответствующий файл, он не работает.

Ярлык

Вместо использования командного файла можно создать только ярлык для запуска приложения.Это ссылка на эту команду: c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar".Windows автоматически перенаправляет этот вызов в каталог SysWOW64, если установлена ​​32-битная Java JRE.

Проблемы:

  • Невозможно связать файлы с ним, поскольку Windowsтолько принимает файлы EXE / COM / PIF / BAT / CMD в качестве целей ассоциации.Файлы LNK не работают.

Вопрос

Есть ли другое решение, которое отвечает всем требованиям, изложенным выше?Или есть какие-то хитрости для решения проблем с упомянутыми решениями?

Решение

После решения проблемы закрепления панели задач с помощью Launch4j выглядит лучшим решением.Launch4j может быть легко интегрирован в проект Maven (с помощью этого или этого плагина), настройка довольно проста, и все работает из коробки, кроме закрепления панели задач.Для закрепления панели задач приложение Java должно установить appModelUserId, как объяснено в ответе на этот вопрос .

Кроме того, приложение Java должно быть установлено установщиком, который должен установить хотя бы один ярлык, указывающийв EXE.Этот ярлык также должен содержать appModelUserId.С NSIS это можно сделать с помощью WinShell plugin и такой конфигурации:

CreateShortCut "$SMPROGRAMS\MyApp.lnk" \
    "$INSTDIR\myapp.exe" "" "$INSTDIR\myapp.exe" 0 SW_SHOWNORMAL
WinShell::SetLnkAUMI "$SMPrograms\MyApp.lnk" "MyAppModelUserId"

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

Ответы [ 5 ]

7 голосов
/ 17 февраля 2012

Попробуйте Launch4j (http://launch4j.sourceforge.net/), - это простой jar to exe обертка (на самом деле упаковка jar необязательна). Она должна соответствовать вашим требованиям к иконке и панели задач. Она также может найти установленные JRE (некоторые настраиваемые правила) Проблема со шрифтами, которую я не совсем понимаю, Swing должен автоматически использовать шрифты в зависимости от настроек Windows, если вы как-то не перезаписываете это в опциях JRE или в коде.

6 голосов
/ 17 февраля 2012

Java Web Start - в наши дни я бы не стал распространять приложение другим способом.

У пользователя должна быть хотя бы J2SE 1.4;если вашим приложениям требуется более поздняя версия, Web Start автоматически загрузит соответствующую JRE.

См. ссылку JNLP для тегов для интеграции с рабочим столом (shortcut и offline-allowed), иассоциации файлов (association).Хотя они поддерживаются только в WS 1.5.

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

Я лично использую Launch4j (через maven с maven-launch4j-plugin , чтобы быть более точным), и я реализую управление системным треем из моего приложения ... (См. http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/).

1 голос
/ 18 февраля 2012

Кроме того, обратите внимание на новую функцию, позволяющую разместить ваше приложение в панели инструментов / системном трее:

У Oracle есть учебник по использованию системного трея.

Это связано с Java SE 6 ... меня также интересует, какие еще плюсы могут быть в более новой Java 7?

1 голос
/ 18 февраля 2012

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

Однако из того, что вы описываете, похоже, что у вас есть очень специфические требования от нативного средства запуска Java.Почему бы просто не написать свой?Вы можете начать с чего-то вроде WinRun4J (с открытым исходным кодом, лицензируемого по Eclipse CPL) и просто изменить его под свои нужды.

В качестве альтернативы вы можете посмотреть на собственные программы запуска, используемые другими программами.Пусковые установки Eclipse и NetBeans, кажется, работают довольно хорошо, и оба с открытым исходным кодом.Вы также можете легко адаптировать один из них.

...