Требования
Я хочу опубликовать приложение 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.