Как лучше всего запускать Java-приложения в Windows 7?
Требования
Я хочу опубликовать приложение 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 и такой конфигурации:
CreateShortCut "$SMPROGRAMS\MyApp.lnk" \
"$INSTDIR\myapp.exe" "" "$INSTDIR\myapp.exe" 0 SW_SHOWNORMAL
WinShell::SetLnkAUMI "$SMPrograms\MyApp.lnk" "MyAppModelUserId"
По какой-то неизвестной причине этот ярлык должен только существовать. Вы не должны использовать это. Вы можете дважды щелкнуть по EXE, и закрепление на панели задач все еще работает. Вы даже можете создать ярлык в некоторой подпапке в папке вашего приложения. Прикрепление панели задач перестает работать после удаления последнего ярлыка файла EXE.
5 ответов
Попробуйте Launch4j ( http://launch4j.sourceforge.net/), это простой jar для exe-оболочки (на самом деле упаковка jar необязательна). Он должен соответствовать вашим требованиям к иконке и панели задач. Он также может найти установленные JRE (некоторые настраиваемые правила). Проблема со шрифтами, которую я не совсем понимаю, Swing должен автоматически использовать шрифты в зависимости от настроек Windows, если только вы не перезаписываете это в опциях JRE или в коде.
Java Web Start - в наши дни я бы не стал распространять приложение иначе.
Пользователь должен иметь как минимум J2SE 1.4; если вашим приложениям требуется более поздняя версия, Web Start автоматически загрузит соответствующую JRE.
См. Ссылку JNLP для тегов для интеграции с рабочим столом (shortcut
а также offline-allowed
) и файловые ассоциации (association
). Они поддерживаются только в WS 1.5.
Лично я использую Launch4j (точнее, через maven с плагином maven-launch4j-plugin) и реализую управление системным треем из своего приложения... (См. http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/).
В целом у меня был хороший успех с WinRun4J, но я не особо много делал со шрифтами, поэтому, признаюсь, я не уверен, что понимаю, почему у вас возникла проблема, которую вы там описали.
Однако из того, что вы описываете, похоже, что у вас есть очень специфические требования от нативного средства запуска Java. Почему бы просто не написать свой? Вы можете начать с чего-то вроде WinRun4J (с открытым исходным кодом, лицензируемого по Eclipse CPL) и просто изменить его под свои нужды.
Кроме того, вы можете посмотреть на собственные программы запуска, используемые другими программами. Пусковые установки Eclipse и NetBeans, кажется, работают довольно хорошо, и оба с открытым исходным кодом. Вы можете легко адаптировать один из них.
Кроме того, также обратите внимание на новую функцию, чтобы ваше приложение находилось в панели инструментов / системном трее:
У Oracle есть руководство по использованию системного трея.
Это связано с Java SE 6... меня также интересует, какие еще плюсы могут быть в более новой Java 7?