Java System Tray Application в Linux (Ubuntu) стартира от услуга (демон)

Здравейте, пиша java приложение за linux (ubuntu), което има tray приложение и услуга за демон приложения.

Мога да изпълня основното приложение като демон с помощта на yajsw. При влизане на потребител в системата искам услугата да бъде уведомена, което е постигнато (написах скрипт и го поставих в папка /etc/profile.d/, скриптът се изпълнява оттам, аз се свързвам към основното приложение, използвайки връзка с TCP сокет и предаване на регистрираното потребителско име)

Сега от главното приложение искам да стартирам приложението Tray в работния плот на текущия потребител, който ще покаже иконата на трея (SystemTray от java.awt) и изскачащото меню. Имам отделен файл jar, създаден за приложение в трей.


person jan_kiran    schedule 13.11.2013    source източник


Отговори (2)


Един от начините е да стартирате приложението на трея в друг процес

Process p = Runtime.
               getRuntime().
               exec(new String[]{"bash","-c","java -jar /path/to/yourjar"});

Като алтернатива можете просто да използвате ОС. Gnome, KDE и Unity поддържат автоматично стартиране на приложения при влизане. Например в Gnome скриптовете в ~/.config/autostart/ се стартират автоматично при влизане.

Лично аз смятам, че най-добрият начин би бил

  1. Използвайте операционната система, за да стартирате автоматично приложението в системната област при влизане
  2. По време на инициализацията проверете дали демонът работи от приложението в системната област
  3. Показвайте актуализациите си от демона или покажете предупреждение, ако демонът не е наличен
person JustDanyul    schedule 13.11.2013
comment
Използвах Processbuilder и команда като sudo -u ‹username› java -cp /path/jar mainclass. Приложението на трея се стартира и SystemTray.isSupported() връща false. Ако стартирам приложението на трея директно от файла на профила, проблемът е, че ако потребителите убият приложението, няма да мога да стартирам отново приложението от демона. Заклещен съм тук - person jan_kiran; 13.11.2013
comment
Въпреки че все още не мисля, че това е правилният начин (стартиране от демона), сигурни ли сте, че стартира на правилния дисплей? Опитайте да добавите DISPLAY=:n, където n е номерът на x дисплея, на който искате да работи - person JustDanyul; 13.11.2013
comment
Създадох скрипт с +x разрешение за всички и изпълних скрипта с помощта на конструктор на процеси sudo -u ‹username› /path/script.sh - person jan_kiran; 13.11.2013
comment
Но изпълнявате ли го в правилната среда. Например, ако стартирате демона, преди действително да работи x сървър, и след това създадете процес. Няма да има правилно зададена променлива на средата DISPLAY. Така че основно във вашия скрипт задайте DISPLAY=:0 (или какъвто и да е дисплей, на който искате да стартирате Java програмата), преди да стартирате Java приложението - person JustDanyul; 13.11.2013
comment
В скриптовия файл, както беше предложено, добавих #!/bin/sh export DISPLAY=:0; java -cp /path/jar mainclass. когато първият потребител влезе в системата, SystemTray.isSupported() връща false, когато вторият потребител влезе в системата, получава грешка, не може да се свърже с X11 сървър, използвайки ':0' - person jan_kiran; 13.11.2013
comment
Първо, мога ли просто да потвърдя, че SystemTray.isSupported() връща true, когато стартирате ръчно приложението на трея? В противен случай всичко това е точка на настроението и трябва да разрешите друг проблем, преди да се тревожите за автоматизирането му. Второ, трябва да следите какъв дисплей използвате, току-що използвах 0 като пример, не можете просто да продължите да го използвате повторно, когато няколко потребители са влезли и се надявате всички да споделят един и същ дисплей. Прочетете това: support.objectplanet.com/esupport/ - person JustDanyul; 13.11.2013
comment
Когато стартирам ръчно, получавам истина и показва трея за текущия потребител, има ли начин да извикам демона след стартиране на работния плот, но не мога да поставя файла със скрипта в домашната директория на всички потребители. Трябва да е на системно ниво като папка /etc/profile.d - person jan_kiran; 13.11.2013
comment
Много силно подозирам, че това се дължи на това, че не работи на правилната комбинация x дисплей/потребител (забелязах, че сте премахнали sudo частта от скрипта си в последния си коментар, дали това беше само за да бъде коментарът кратък). Независимо от това, със сигурност ще трябва да се уверите, че изпълнявате командата СЛЕД като x сесията е напълно заредена за потребителя. Не бих използвал /etc/profile.d за X неща между другото. Бих погледнал /etc/x11/xinit/xinitrc.d - person JustDanyul; 13.11.2013
comment
нека да продължим тази дискусия в чата - person jan_kiran; 13.11.2013

Добавен е скриптовият файл под /etc/X11/Xsession.d/98script, който ще бъде извикан при влизане на потребител след създаване на сесия, така че да можете да получите стойността на $DISPLAY, която е важна за стартирането на приложението на java tray в сесията. От скрипта, наречен демон java приложение, което слуша tcp порта От демон java приложението изпълнете скрипта startapp, подайте регистрираното потребителско име и неговия DISPLAY в скрипта на startapp, експортирайте DISPLAY и експортирайте ПОТРЕБИТЕЛСКО ИМЕ и изпълнете приложението на панела, което ще се стартира в потребител сесията и таблото се показват в една и съща област на дисплея

person Community    schedule 14.11.2013