Bezhlavý režim Java

1. Prehľad

Príležitostne musíme pracovať s grafickými aplikáciami v prostredí Java bez skutočného displeja, klávesnice alebo myši, povedzme na serveri alebo kontajneri.

V tomto krátkom tutoriáli sa dozvieme o bezhlavom režime Java, ktorý bude slúžiť na riešenie tohto scenára. Taktiež sa pozrieme na to, čo môžeme robiť v bezhlavom režime a čo nie.

2. Nastavenie režimu bez hlavy

Existuje mnoho spôsobov, ako môžeme v Jave explicitne nastaviť režim bez hlavy:

  • Programové nastavenie vlastnosti systému java.awt.hlava do pravda
  • Pomocou argumentu príkazového riadku: java -Djava.awt.headless = true
  • Pridávanie -Djava.awt.headless = pravda do JAVA_OPTS premenná prostredia v spúšťacom skripte servera

Ak je prostredie skutočne bezhlavé, JVM by si to bolo implicitne vedomé. V niektorých scenároch však budú jemné rozdiely. Uvidíme ich čoskoro.

3. Príklady komponentov používateľského rozhrania v bezhlavom režime

Typickým prípadom použitia komponentov používateľského rozhrania bežiacich v bezhlavom prostredí môže byť aplikácia na prevod obrázkov. Aj keď na spracovanie obrazu potrebuje grafické údaje, displej nie je skutočne potrebný. Aplikáciu je možné spustiť na serveri a prevádzať súbory uložené alebo odoslané cez sieť na iné zariadenie na zobrazenie.

Pozrime sa na to v akcii.

Najskôr programovo zapneme bezhlavý režim v a JUnit trieda:

@Before public void setUpHeadlessMode () {System.setProperty ("java.awt.headless", "true"); } 

Aby sme sa ubezpečili, že je správne nastavený, môžeme použiť java.awt.GrafikaŽivotné prostredie#je bezhlavý:

@Test public void whenSetUpSuccessful_thenHeadlessIsTrue () {assertThat (GraphicsEnvironment.isHeadless ()). IsTrue (); } 

Mali by sme na pamäti, že vyššie uvedený test uspeje v bezhlavom prostredí, aj keď režim nie je výslovne zapnutý.

Teraz sa pozrime na náš jednoduchý prevodník obrázkov:

@Test public void whenHeadlessMode_thenImagesWork () {boolean result = false; try (InputStream inStream = HeadlessModeUnitTest.class.getResourceAsStream (IN_FILE); FileOutputStream outStream = nový FileOutputStream (OUT_FILE)) {BufferedImage inputImage = ImageIO.read (inStream); výsledok = ImageIO.write (inputImage, FORMAT, outStream); } assertThat (vysledok) .isTrue (); }

V tejto ďalšej ukážke vidíme, že máme k dispozícii aj informácie o všetkých písmach vrátane metrík písma:

@ Test public void whenHeadless_thenFontsWork () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); Reťazcové písma [] = ge.getAvailableFontFamilyNames (); assertThat (fonty) .isNotEmpty (); Písmo písma = nové Písmo (písma [0], Font.BOLD, 14); FontMetrics fm = (nové Canvas ()). GetFontMetrics (písmo); assertThat (fm.getHeight ()). isGreaterThan (0); assertThat (fm.getAscent ()). isGreaterThan (0); assertThat (fm.getDescent ()). isGreaterThan (0); }

4. Bezhlavá výnimka

Existujú komponenty, ktoré vyžadujú periférne zariadenia a nebudú fungovať v bezhlavom režime. Hodia a Bezhlavá výnimka pri použití v neinteraktívnom prostredí:

Výnimka vo vlákne „main“ java.awt.HeadlessException na java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:204) na java.awt.Window. (Window.java:536) na java.awt.Frame. (Frame. java: 420)

Tento test potvrdzuje, že použitie Rám v bezhlavom režime skutočne hodí a Bezhlavá výnimka:

@Test public void whenHeadlessmode_thenFrameThrowsHeadlessException () {assertThatExceptionOfType (HeadlessException.class) .isThrownBy (() -> {Frame frame = new Frame (); frame.setVisible (true); frame.setSize (120, 120);}); } 

Ako všeobecné pravidlo si pamätajte, že komponenty najvyššej úrovne ako napr Rám a Tlačidlo vždy potrebujete interaktívne prostredie a vyvolá túto výnimku. Avšak bude vyhodený ako nenahraditeľný Chyba ak nie je bezhlavý režim výslovne nastavený.

5. Obchádzanie komponentov vysokej váhy v bezhlavom režime

V tomto okamihu si možno kladieme otázku sami pre seba - ale čo keď máme kód s komponentmi grafického používateľského rozhrania, ktorý bude fungovať v obidvoch typoch prostredí - produkčný stroj s hlavičkou a server na analýzu zdrojového kódu bez hlavy?

Vo vyššie uvedených príkladoch sme videli, že komponenty vysokej váhy nebudú na serveri fungovať a spôsobia výnimku.

Môžeme teda použiť podmienený prístup:

public void FlexibleApp () {if (GraphicsEnvironment.isHeadless ()) {System.out.println ("Hello World"); } else {JOptionPane.showMessageDialog (null, "Hello World"); }}

Pomocou tohto vzoru môžeme vytvoriť flexibilnú aplikáciu, ktorá upraví jej správanie podľa prostredia.

6. Záver

S rôznymi ukážkami kódu sme videli, ako a prečo bezhlavý režim v Jave. Tento technický článok poskytuje kompletný zoznam toho, čo všetko je možné urobiť pri práci v bezhlavom režime.

Ako obvykle je zdrojový kód vyššie uvedených príkladov k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found