מצב ג'אווה ללא ראש

1. סקירה כללית

מדי פעם, אנחנו צריכים לעבוד עם יישומים מבוססי גרפיקה ב- Java ללא תצוגה ממשית, מקלדת או עכברנניח בשרת או במכולה.

במדריך קצר זה, אנו הולכים ללמוד על המצב ללא ראש של Java כדי לטפל בתרחיש זה. נבדוק גם מה אנחנו יכולים לעשות במצב ללא ראש ומה לא.

2. הגדרת מצב ללא ראש

ישנן דרכים רבות בהן אנו יכולים להגדיר מצב ללא ראש ב- Java באופן מפורש:

  • הגדרה תכנתית של מאפיין המערכת java.awt. ללא ראש ל נָכוֹן
  • באמצעות הארגומנט של שורת הפקודה: java -Djava.awt.headless = נכון
  • מוֹסִיף -Djava.awt.headless = נכון אל ה JAVA_OPTS משתנה סביבה בתסריט הפעלת שרת

אם הסביבה אכן חסרת ראש, ה- JVM היה מודע לכך באופן מרומז. עם זאת, יהיו הבדלים עדינים בכמה תרחישים. נראה אותם בקרוב.

3. דוגמאות לרכיבי ממשק משתמש במצב ללא ראש

מקרה שימוש אופייני של רכיבי ממשק משתמש הפועלים בסביבה ללא ראש יכול להיות אפליקציית ממיר תמונות. למרות שהוא זקוק לנתונים גרפיים לעיבוד תמונה, תצוגה אינה ממש נחוצה. ניתן להריץ את האפליקציה בשרת ולקבצים מומרים שנשמרו או נשלחו ברשת למכונה אחרת לתצוגה.

בואו נראה את זה בפעולה.

ראשית, נפעיל את המצב ללא ראש באופן תכנותי ב JUnit מעמד:

@ לפני בטל הציבורי setUpHeadlessMode () {System.setProperty ("java.awt.headless", "true"); } 

כדי לוודא שהוא מוגדר כהלכה, נוכל להשתמש בו java.awt.GraphicsEnvironment#הוא ללא ראש:

@ מבחן ציבורי בטל כאשר SetUpSuccessful_thenHeadlessIsTrue () {assertThat (GraphicsEnvironment.isHeadless ()). IsTrue (); } 

עלינו לזכור כי המבחן הנ"ל יצליח בסביבה נטולת ראש גם אם המצב לא מופעל במפורש.

בואו נראה את ממיר התמונות הפשוט שלנו:

@ מבחן ציבורי בטל כאשר HeadlessMode_thenImagesWork () {תוצאה בוליאנית = שקר; נסה (InputStream inStream = HeadlessModeUnitTest.class.getResourceAsStream (IN_FILE); FileOutputStream outStream = FileOutputStream חדש (OUT_FILE)) {BufferedImage inputImage = ImageIO.read (inStream); תוצאה = ImageIO.write (inputImage, FORMAT, outStream); } assertThat (תוצאה). isTrue (); }

במדגם הבא זה אנו יכולים לראות כי מידע על כל הגופנים, כולל מדדי הגופן, זמין גם לנו:

@ מבחן ציבורי בטל כאשר Headless_thenFontsWork () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); גופני מחרוזת [] = ge.getAvailableFontFamilyNames (); assertThat (גופנים) .isNotEmpty (); גופן גופן = גופן חדש (גופנים [0], פונט.BOLD, 14); FontMetrics fm = (בד חדש ()). GetFontMetrics (פונט); assertThat (fm.getHeight ()). isGreaterThan (0); assertThat (fm.getAscent ()). isGreaterThan (0); assertThat (fm.getDescent ()). isGreaterThan (0); }

4. חריג ללא ראש

ישנם רכיבים הדורשים מכשירים היקפיים ולא יפעלו במצב ללא ראש. הם זורקים א חריג ללא ראש כאשר משתמשים בסביבה שאינה אינטראקטיבית:

חריג בשרשור "ראשי" java.awt.HeadlessException ב java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:204) ב java.awt.Window. (Window.java:536) ב java.awt.Frame. (מסגרת. ג'אווה: 420)

בדיקה זו קובעת כי השימוש ב מִסגֶרֶת במצב ללא ראש אכן יזרוק א חריג ללא ראש:

@ מבחן ציבורי בטל כאשרHeadlessmode_thenFrameThrowsHeadlessException () {assertThatExceptionOfType (HeadlessException.class) .isThrownBy (() -> {Frame frame = New Frame (); frame.setVisible (true); frame.setSize (120, 120);}); } 

ככלל אצבע, זכור כי רכיבים ברמה העליונה כגון מִסגֶרֶת ו לַחְצָן תמיד זקוק לסביבה אינטראקטיבית וישליך את החריג הזה. למרות זאת, זה ייזרק כבלתי ניתן לשחזור שְׁגִיאָה אם המצב ללא ראש אינו מוגדר במפורש.

5. עקיפת רכיבים במשקל כבד במצב ללא ראש

בשלב זה, אנו עשויים לשאול שאלה לעצמנו - אך מה אם יש לנו קוד עם רכיבי GUI להפעלה בשני סוגי הסביבות - מכונת ייצור בראשות ושרת ניתוח קוד קוד ללא ראש?

בדוגמאות לעיל ראינו שרכיבי המשקל הכבד לא יעבדו על השרת וישליכו חריג.

אז נוכל להשתמש בגישה מותנית:

חלל ציבורי FlexibleApp () {if (GraphicsEnvironment.isHeadless ()) {System.out.println ("שלום עולם"); } אחר {JOptionPane.showMessageDialog (null, "שלום עולם"); }}

באמצעות דפוס זה, אנו יכולים ליצור אפליקציה גמישה המתאימה את התנהגותה בהתאם לסביבה.

6. מסקנה

בדוגמאות קוד שונות ראינו כיצד ומדוע במצב ללא ראש בג'אווה. מאמר טכני זה מספק רשימה מלאה של כל מה שניתן לעשות בזמן פעולה במצב ללא ראש.

כרגיל, קוד המקור לדוגמאות לעיל זמין ב- GitHub.


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