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

в 9: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 Files7-Zip7z.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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js