Пользователь
0,0
рейтинг
2 августа 2014 в 13:44

Разработка → Гаджет-переключатель между версиями Java

Приветствую, хабражители!

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

А начнем, пожалуй, с конца и взглянем на готовый результат:

image

Перейду к сути. Разрабатывая для Java платформы, я не ограничиваюсь одной ее версией. Причин тому много: целевая hardware платформа, наличие legacy и т.д… И в связи с этим мне часто приходится подправлять переменные среды JAVA_HOME/JRE_HOME/PATH.

Отсюда и выросла идея реализовать переключатель, который позволит удобным образом автоматизировать эти действия. Но как же воплотить идею в жизнь, чтобы было удобно? Тут долго думать не пришлось, формат целевого приложения стал понятен сразу же после того, как взгляд упал на информер погоды на рабочем столе. Итак, это будет гаджет для windows sidebar.

Для нетерпеливых, давайте пробовать:
1) В пользовательских переменных среды нужно создать: JAVA_HOME и JRE_HOME
2) В PATH добавить %JAVA_HOME%\bin
3) Скачать и установить гаджет — github.com/ice-pro/JavaEnvSwitchGadget/blob/master/JavaEnvSwitchGadget.gadget
4) Но, чтобы все заработало как нужно, мне пришлось сделать еще один весьма нестандартный шаг: в windows/system32 уже лежит java.exe и приоритет этой папки выше того, что указано в PATH. Поэтому пришлось переименовать файл из system32 в "_java.exe"

Все, можно конфигурировать пути к установленным JDK/JRE и пользоваться.

А теперь для тех кому интересны детали.
Что же такое гаджет? Gadget в windows — это приложение с помощью которого можно визуализировать некие данные или даже осуществлять обратное взаимодействие.

Разработка гаджетов базируется на стандартном наборе web технологий — HTML/CSS/JS. Конечно, можно и C# использовать (к примеру используя вот этот шаблон — visualstudiogallery.msdn.microsoft.com/bf347eb6-99bd-4c99-89d0-6ca3fe1eb54e), но в данной заметке я не буду усложнять простые вещи и выберу native путь.

Базовый каркас гаджета состоит из двух файлов — html страничка с визуальной частью и xml дескриптор.
Полное описание тегов дескриптора можно найти тут msdn.microsoft.com/en-us/library/windows/desktop/ff486356(v=vs.85).aspx
Дескриптор для моего гаджета (приводить код не буду, так как примечательного там ничего нет), вместе с остальными исходниками доступен тут github.com/ice-pro/JavaEnvSwitchGadget

Теперь перейдем к главной страничке гаджета. Тут есть несколько моментов которые хочу пояснить:
— т.к. гаджет будет содержать еще одну дополнительную страницу — настройки, то ее нужно указать явно вот таким образом (для меня был слегка странным тот факт, что это делать нужно не в xml):

document.onreadystatechange = function() {
    if(document.readyState == 'complete') {
        System.Gadget.settingsUI = 'settings.html';
    }
}

— для работы с настройка используется простенькое API:
var val = System.Gadget.Settings.read(key);

— и самое интересное, работа с переменными среды:
var shell = new ActiveXObject('WScript.Shell');
var vars = shell.Environment('User');
vars('JAVA_HOME') = jdk;
vars('JRE_HOME') = jre;


На страничке параметров есть лишь одно место, на котором хотелось бы сделать акцент — сохранение этих самых параметров:

System.Gadget.onSettingsClosing = applySettings; // указываем функцию которую нужно вызывать при закрытии окна параметров

function applySettings(event) {
    if (event.closeAction == event.Action.commit) {
        // сохраняемся...
    }
}


На этом все, реализация готова. Теперь можно приступить к сборке. Гаджет в готовом виде представляет собой zip архив, только с расширением .gadget.

Для сборки я написал небольшой командный скрипт. Выглядит он вот так:

del JavaEnvSwitchGadget.gadget
"C:\Program Files\7-Zip\7z.exe" a -tzip -x!.idea -x!.git -x!_stuff -x!build.cmd -r JavaEnvSwitchGadget *.*
move JavaEnvSwitchGadget.zip JavaEnvSwitchGadget.gadget
pause


А теперь немного про отладку (детально можно прочесть тут msdn.microsoft.com/en-us/library/windows/desktop/bb456467(v=vs.85).aspx)

Для начала плохие новости: по-быстрому отладить с помощью alert-ов не получится, так как в Sidebar нету их имплементации (workaround — использовать MsgBox).

Но давайте сделаем все правильно.

1) Прежде всего настраиваем Internet Explorer, в разделе Advanced убираем галочки возле «Disable script debugging»
2) Настраиваем Visual Studio, в Tools — Options — Just-In-Time ставим галку возле Script.
3) Последнее, чтобы прервать выполнение работы гаджета и позвать на помощь отладчик, нужна всего одна строчка в коде

debugger;


Теперь при запуске гаджета мы увидим окошко предлагающее нам подключиться к трассировке кода.

Спасибо за прочтение, надеюсь кому-то да пригодится.

Полезные ссылки:
1) github.com/ice-pro/JavaEnvSwitchGadget — исходники и сборка
2) msdn.microsoft.com/en-us/library/windows/desktop/bb456468(v=vs.85).aspx — пошаговое руководство для разработки
3) msdn.microsoft.com/en-us/library/windows/desktop/bb456467(v=vs.85).aspx — описание метода отладки
4) msdn.microsoft.com/en-us/library/windows/desktop/ff486356(v=vs.85).aspx — описание xml дескриптора
5) msdn.microsoft.com/en-us/magazine/cc163370.aspx — еще одна статья про разработку, но более старая и для Vista
6) stackoverflow.com/questions/768477/setting-an-environment-variable-in-javascript — работа с переменными среды из JS

P.S. По вопросу версий, между которыми предлагается переключение, я, пожалуй, ничего говорить не буду. Если кому нужно урезать/расширить список, то делается это быстро.
P.S.2. По аналогии (да что там, copy-paste'ом) можно реализовать переключатель для Python 2/3.
Ануфриев Алексей @icepro
карма
30,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (20)

  • +8
    Мне кажется, не актуально.
    • 0
      Почему?
      • +8
        Пишу на Java. В проектах используется 6, 7 и 8. Никогда не было необходимости в таком переключателе…
        • 0
          Согласен, такое делать часто не приходится, меня лично менять переменные среды заставил dev kit от marmalade.
          • 0
            т.е. вместо того, чтобы сделать несколько скриптов, выставляющих в текущем окружении нужный JAVA_HOME, вы меняете глобальный JAVA_HOME?
            • 0
              Запутался в терминологии. Среда разработки от marmalade не умеет настраивать SDK в проекте, она ориентируется на JAVA_HOME, и в частном случае мне нужно было значение JDK6. В то же время как основную JDK которую я использую — 8. Поэтому и решил сделать переключатель.
              • 0
                при запуске среды разработки вы всё равно запускаете некий exe-файл. Ничто не мешает положить рядом bat-файл, в котором написать:
                set JAVA_HOME=MY_JAVA_VERSION_PATH
                некий_файл.exe
                

                и запускать уже не exe, а bat-файл

                Учитывая, что ваш SDK на чём то базируется (возможно на Eclipse), то там может быть и вовсе уже лежать готовый bat-файл (в той же IntelliJ IDEA основной файл idea.bat, который запускается с помощью idea.exe), внутри которого происходит проверка переменной JAVA_HOME и её использование — тогда можно сразу в начало этого файла подсунуть нужное вам значение.
                • 0
                  Спасибо за совет, весьма резонно. На вскидку я такого не видел, нужно исследовать.
      • +8
        В Win8 гаджеты выпилили и похоже они уже не вернуться.
        • +1
          Мотивировали тем что оно насквозь дырявое, и правильно сделали!
        • 0
          именно
        • 0
          Гаджеты выпилили, а HTA — нет (проверено в Win8.1).
        • 0
          8gadgetpack.net/
          Пользуюсь с первого дня на Windows 8, работает идеально, довольно регулярно обновляется.
      • +3
        Лучше хранить такие вещи в настройках проекта (IDEA, Eclipse и т. д.). Просто переключатель кажется не очень гибким. Например, вы разрабатываете приложение на Java 1.7 и попутно библиотеку к этому приложению, которая должна работать в Java 1.5. В IDE они будут одновременно компилироваться каждая со своей версией. А как этого достичь с вашим переключателем? Настройка на уровне проекта позволяет не думать ни о каких переключателях, да и все участники проекта будут пользоваться одной и той же версией.
        • 0
          Абсолютно верно. Единственный случай, который я смог припомнить в своей практике — разрабатывал плагин для JIRA не очень свежей версии. Вот там dev kit при запуске проверял версию jre и отказывался запускаться на чем-либо кроме 1.6.
      • 0
        Может в силу того, что если у вас под разные приложения требуются разные версии Java, то менять надо не глобальное, а локальное окружение у каждого приложения?
  • 0
    Гаджетами обычно называют устройства, а мини-программы с пользовательским интерфейсом — виджетами. Это я к тому, что зашел под кат в надежде прочитать про то, как вы физический девайс делали.
    • +3
      В винде оно реально называется gadgets.
      • +2
        Мощно они задвинули. Давно не пользовался, но не удивлен)
  • 0
    Насколько я понимаю, все равно придется перезапускать консоль/браузер/etc., чтобы подхватить новые переменные окружения. Если мы говорим про консольный запуск, проще сделать несколько sh-скриптов с разным environment, несколько ярлыков для браузера для разных версий java, а по-хорошему, как написали выше, это конфигурируется в IDE.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.