Java fej nélküli mód

1. Áttekintés

Időnként meg kell grafikus alapú alkalmazásokkal dolgozhat Java-ban tényleges kijelző, billentyűzet vagy egér nélkülmondjuk szerveren vagy tárolón.

Ebben a rövid bemutatóban megismerjük a Java fej nélküli módját, hogy kezeljük ezt a forgatókönyvet. Megvizsgáljuk azt is, hogy mit tehetünk fej nélküli módban és mit nem.

2. Fej nélküli mód beállítása

Sokféleképpen állíthatjuk be kifejezetten a fej nélküli módot a Java-ban:

  • A rendszer tulajdonságának programozott beállítása java.awt.fej nélküli nak nek igaz
  • A parancssori argumentum használata: java -Djava.awt.fej nélküli = igaz
  • Hozzáadás -Djava.awt.fej nélküli = igaz hoz JAVA_OPTS környezeti változó a szerver indítási parancsfájljában

Ha a környezet valóban fejetlen, a JVM implicit módon tudatában lenne annak. Néhány forgatókönyvben azonban vannak finom különbségek. Rövidesen meglátjuk őket.

3. Példák a felhasználói felület összetevőire fej nélküli módban

A fej nélküli környezetben futó felhasználói felület-összetevők tipikus használati esete lehet egy képátalakító alkalmazás. Bár a képfeldolgozáshoz grafikus adatokra van szüksége, a megjelenítésre valójában nincs szükség. Az alkalmazást futtathatja egy szerveren, és konvertálhatja a hálózaton keresztül mentett vagy elküldött fájlokat egy másik gépre megjelenítésre.

Lássuk ezt működés közben.

Először a fej nélküli módot kapcsoljuk be programozottan a JUnit osztály:

@ Mielőtt nyilvános void setUpHeadlessMode () {System.setProperty ("java.awt.headless", "true"); } 

A megfelelő beállítás érdekében használhatjuk java.awt.GraphicsEnvironment#is Fejetlen:

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

Nem szabad megfeledkeznünk arról, hogy a fenti teszt fejetlen környezetben akkor is sikeres lesz, ha az üzemmód nincs kifejezetten bekapcsolva.

Most nézzük meg az egyszerű képátalakítónkat:

@Test public void whenHeadlessMode_thenImagesWork () {logikai eredmény = hamis; próbáld meg (InputStream inStream = HeadlessModeUnitTest.class.getResourceAsStream (IN_FILE); FileOutputStream outStream = new FileOutputStream (OUT_FILE)) {BufferedImage inputImage = ImageIO.read (inStream); eredmény = ImageIO.write (inputImage, FORMAT, outStream); } assertThat (eredmény) .isTrue (); }

Ebben a következő mintában láthatjuk, hogy az összes betűtípusra vonatkozó információ, beleértve a betűmérőket is, rendelkezésünkre áll:

@Test public void whenHeadless_thenFontsWork () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); Karakterláncok [] = ge.getAvailableFontFamilyNames (); assertThat (betűtípusok) .isNotEmpty (); Font font = new Font (betűtípusok [0], Betűtípus.BOLD, 14); FontMetrics fm = (új Canvas ()). GetFontMetrics (font); assertThat (fm.getHeight ()) isGreaterThan (0); assertThat (fm.getAscent ()). Nagyobb (0); assertThat (fm.getDescent ()) isGreaterThan (0); }

4. HeadlessException

Vannak olyan alkatrészek, amelyekhez perifériás eszközök szükségesek, és fejetlen üzemmódban nem működnek. Dobnak egy HeadlessException ha nem interaktív környezetben használják:

Kivétel a "main" szálban java.awt.HeadlessException a java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:204) címen a java.awt.Window. (Window.java:536) oldalon java.awt.Frame. (Frame. java: 420)

Ez a teszt azt állítja, hogy a Keret fejetlen módban valóban dobni fog a HeadlessException:

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

Alapszabályként ne feledje, hogy a legfelső szintű összetevők, mint pl Keret és Gomb mindig interaktív környezetre van szükségük, és ezt a kivételt el fogja vetni. Azonban, helyrehozhatatlannak fogják dobni Hiba ha a fej nélküli mód nincs kifejezetten beállítva.

5. A nehézsúlyú alkatrészek megkerülése fej nélküli módban

Ezen a ponton kérdéseket tehetünk fel magunknak - de mi van, ha van GUI-összetevõkkel ellátott kódunk mindkét típusú környezetben való futtatáshoz - egy fejlécû gép és egy fej nélküli forráskód-elemzõ szerver?

A fenti példákban azt láttuk, hogy a nehézsúlyú alkatrészek nem fognak működni a szerveren, és kivételt fognak hozni.

Tehát feltételes megközelítést alkalmazhatunk:

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

Ezzel a mintával létrehozhatunk egy rugalmas alkalmazást, amely a környezethez igazítja viselkedését.

6. Következtetés

Különböző kódmintákkal láttuk, hogy a fejetlen mód hogyan és miért java-ban. Ez a technikai cikk teljes listát tartalmaz arról, hogy mit lehet teljesíteni fej nélküli üzemmódban.

Szokás szerint a fenti példák forráskódja elérhető a GitHubon.