Подтвердить что ты не робот

Какой лучший способ запустить Java-приложения в Windows 7?

Требования

Я хочу опубликовать приложение Java GUI в 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 не устанавливает это автоматически.
  • При связывании файлов с пакетным файлом не может быть установлен пользовательский значок.
  • Поддержка панели задач не работает должным образом. Приложение может быть привязано к нему, когда командный файл запускается вручную, но при двойном щелчке связанного файла вместо этого он не работает.

Shortcut

Вместо использования командного файла можно создать только ярлык для запуска приложения. Он ссылается на эту команду: 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 (с this или this), конфигурация довольно проста, и все работает вне поля, кроме фиксации панели задач. Для привязки панели задач приложение 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 файла.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 4

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

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

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

Ответ 5

Как и в стороне, также ознакомьтесь с новой функцией, чтобы ваше приложение находилось в tooltray/systemtray:

В Oracle есть учебник о том, как использовать системный трей.

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