Način bez glave Java

1. Pregled

Povremeno to trebamo radite s aplikacijama zasnovanim na grafikama na Javi bez stvarnog zaslona, ​​tipkovnice ili mišarecimo na serveru ili spremniku.

U ovom kratkom vodiču naučit ćemo o Javinom načinu bez glave za rješavanje ovog scenarija. Također ćemo pogledati što možemo raditi u načinu bez glave, a što ne.

2. Postavljanje načina bez glave

Postoji mnogo načina na koje možemo izričito postaviti način bez glave u Javi:

  • Programsko postavljanje svojstva sustava java.awt.bezglavi do pravi
  • Korištenje argumenta naredbenog retka: java -Djava.awt.headhead = true
  • Dodavanje -Djava.awt.headless = true prema JAVA_OPTS varijabla okoline u skripti za pokretanje poslužitelja

Ako je okoliš zapravo bez glave, JVM bi ga implicitno bio svjestan. Međutim, u nekim scenarijima bit će suptilne razlike. Vidjet ćemo ih uskoro.

3. Primjeri komponenata korisničkog sučelja u načinu bez glave

Tipičan slučaj upotrebe komponenata korisničkog sučelja koje se izvode u bezglavom okruženju može biti aplikacija za pretvorbu slika. Iako su mu potrebni grafički podaci za obradu slike, prikaz zapravo nije potreban. Aplikacija se može pokrenuti na poslužitelju i pretvoriti datoteke spremljene ili poslane mrežom na drugi stroj za prikaz.

Pogledajmo ovo na djelu.

Prvo ćemo programski uključiti način bez glave u a JUNIT razred:

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

Možemo koristiti kako bismo bili sigurni da je pravilno postavljen java.awt.GraphicsEnvironment#jeBezglava:

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

Morali bismo imati na umu da će gornji test uspjeti u bezglavom okruženju čak i ako način nije izričito uključen.

Sada ćemo vidjeti naš jednostavni pretvarač slika:

@Test javna void whenHeadlessMode_thenImagesWork () {boolean rezultat = false; probajte (InputStream inStream = HeadlessModeUnitTest.class.getResourceAsStream (IN_FILE); FileOutputStream outStream = novi FileOutputStream (OUT_FILE)) {BufferedImage inputImage = ImageIO.read (inStream); rezultat = ImageIO.write (inputImage, FORMAT, outStream); } assertThat (rezultat) .isTrue (); }

U ovom sljedećem uzorku možemo vidjeti da su nam dostupne i informacije o svim fontovima, uključujući mjerne podatke o fontovima:

@Test public void whenHeadless_thenFontsWork () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); Fontovi u nizu [] = ge.getAvailableFontFamilyNames (); assertThat (fontovi) .isNotEmpty (); Font fonta = novi font (fontovi [0], Font.BOLD, 14); FontMetrics fm = (novo platno ()). GetFontMetrics (font); assertThat (fm.getHeight ()). isGreaterThan (0); assertThat (fm.getAscent ()). isGreaterThan (0); assertThat (fm.getDescent ()). isGreaterThan (0); }

4. Bezglavo izuzeće

Postoje komponente koje zahtijevaju periferne uređaje i neće raditi u načinu bez glave. Bacaju a Bezglavo izuzeće kada se koristi u neinteraktivnom okruženju:

Iznimka u niti "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)

Ovaj test tvrdi da se pomoću Okvir u načinu bez glave doista će baciti a Bezglavo izuzeće:

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

Kao osnovno pravilo, imajte na umu da su komponente najviše razine poput Okvir i Dugme uvijek treba interaktivno okruženje i bacit će ovu iznimku. Međutim, bit će bačen kao nenadoknadiv Pogreška ako način rada bez glave nije izričito postavljen.

5. Zaobilaženje teških komponenata u načinu bez glave

U ovom trenutku možda bismo sebi postavili pitanje - ali što ako imamo kôd s GUI komponentama za pokretanje u obje vrste okruženja - glavnom proizvodnom stroju i bezglavom serveru za analizu izvornog koda?

U gornjim primjerima vidjeli smo da teške komponente neće raditi na poslužitelju i donijet će iznimku.

Dakle, možemo koristiti uvjetni pristup:

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

Pomoću ovog uzorka možemo stvoriti fleksibilnu aplikaciju koja prilagođava svoje ponašanje u skladu s okolinom.

6. Zaključak

S različitim uzorcima koda vidjeli smo kako i zašto način bez glave u javi. Ovaj tehnički članak nudi cjelovit popis onoga što se sve može učiniti tijekom rada u načinu bez glave.

Kao i obično, izvorni kod za gornje primjere dostupan je na GitHubu.


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