הפעלת אפליקציית אתחול אביב עם Maven מול מלחמה / צנצנת הוצאה לפועל

1. הקדמה

במדריך זה נחקור את ההבדלים בין הפעלת יישום אינטרנט של Spring Boot דרך ה- קפיץ אתחול mvn: לרוץ פקודה והפעלתו לאחר הידורו לצנצנת / חבילת מלחמה דרך ה- java -jar פקודה.

נניח שכאן אתה כבר מכיר את התצורה של מגף האביב אריזה מחדש מטרה. לפרטים נוספים בנושא זה, אנא קרא / י צור / ת אפליקציית Fat Jar עם Boot Boot.

2. תוסף Spring Boot Maven

בעת כתיבת יישום Spring Boot, התוסף Spring Boot Maven הוא הכלי המומלץ לבנות, לבדוק ולארוז את הקוד שלנו.

תוסף זה נשלח עם הרבה תכונות נוחות, כגון:

  • זה פותר את גרסאות התלות הנכונות עבורנו
  • זה יכול לארוז את כל התלות שלנו (כולל שרת יישומים מוטבע במידת הצורך) בצנצנת שומן / מלחמה אחת וניתנת לריצה וגם:
    • נהל עבורנו את תצורת מסלול הכיתה, כך שנוכל לדלג על זמן כה רב -cp אפשרות שלנו java -jar פקודה
    • ליישם מותאם אישית ClassLoader לאיתור וטעינה של כל ספריות הצנצנות החיצוניות, המקוננות כעת בתוך החבילה
    • למצוא באופן אוטומטי את רָאשִׁי() שיטה ולהגדיר אותה במניפסט, כך שלא נצטרך לציין את המחלקה הראשית שלנו java -jar פקודה

3. הפעלת הקוד עם Maven בצורה מפוצצת

כשאנחנו עובדים על יישום אינטרנט, אנחנו יכולים למנף תכונה נוספת מאוד מעניינת של ה- תוסף Spring Boot Maven: היכולת לפרוס באופן אוטומטי את יישום האינטרנט שלנו בשרת יישומים מוטבע.

אנו זקוקים רק לתלות אחת כדי ליידע את התוסף שאנחנו רוצים להשתמש ב- Tomcat כדי להריץ את הקוד שלנו:

 org.springframework.boot spring-boot-starter-web 

כעת, בעת ביצוע ה- קפיץ אתחול mvn: לרוץ הפקודה בתיקיית הבסיס של הפרויקט שלנו, התוסף קורא את תצורת ה- pom ומבין שאנחנו זקוקים למיכל יישומי אינטרנט.

ביצוע ה- קפיץ אתחול mvn: לרוץ הפקודה מפעילה את ההורדה של Apache Tomcat ומאתחלת את האתחול של Tomcat.

בואו ננסה את זה:

קפיץ אתחול של $ mvn: הפעל ... ... [INFO] ---------------------------------- ------ [INFO] בניית קפיץ אתחול 0.0.1-SNAPSHOT [INFO] --------------------------- ----- [מלחמה] --------------------------------- [INFO] [INFO] >>> spring-boot-maven-plugin: 2.1.3.RELEASE: run (default-cli)> test-compile @ spring-boot-ops >>> הורדה ממרכז: //repo.maven.apache.org/maven2/org /apache/tomcat/embed/tomcat-embed-core/9.0.16/tomcat-embed-core-9.0.16.pom הורד מהמרכז: //repo.maven.apache.org/maven2/org/apache/tomcat/ להטביע / tomcat-embed-core / 9.0.16 / tomcat-embed-core-9.0.16.pom (1.8 kB ב 2.8 kB / s) ... ... [INFO] --- spring-boot-maven- תוסף: 2.1.3.RELEASE: run (default-cli) @ spring-boot-ops --- ... ... 11: 33: 36.648 [main] INFO oacatalina.core.StandardService - שירות מתחיל [Tomcat] 11: 33: 36.649 [main] INFO oacatalina.core.StandardEngine - מנוע סרוולט מתחיל: [Apache Tomcat / 9.0.16] ... ... 11: 33: 36.952 [main] INFO oaccC [Tomcat]. [Localhost ]. [/] - אתחל אותם באביב WebApplicationContext מיטות ... ... 11: 33: 48.223 [main] INFO oacoyote.http11.Http11NioProtocol - הפעלת פרוטוקול האנדלר ["http-nio-8080"] 11: 33: 48.289 [main] INFO osbwetomcat.TomcatWebServer - Tomcat התחיל ביציאות (ים): 8080 (http) עם נתיב הקשר '' 11: 33: 48.292 [ראשי] INFO org.baeldung.boot.Application - היישום התחיל תוך 22.454 שניות (JVM פועל במשך 37.692)

כאשר היומן מציג את השורה המכילה 'יישום שהתחיל', אפליקציית האינטרנט שלנו מוכנה להישאל באמצעות הדפדפן בכתובת // localhost: 8080 /

4. הפעלת הקוד כיישום ארוז עצמאי

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

למרבה הצער, אם אנו עובדים עם א קַנקַן החבילה, Maven הבסיסית חֲבִילָה המטרה אינה כוללת אף אחת מהתלות החיצונית.

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

כדי לעקוף את המגבלה הזו,עלינו למנף את התוסף Maven Spring Boot אריזה מחדש המטרה להריץ את הצנצנת / המלחמה שלנו כיישום עצמאי.

4.1. תְצוּרָה

בדרך כלל, עלינו להגדיר רק את התוסף לבנות:

  ... org.springframework.boot spring-boot-maven-plugin ... 

אך פרויקט הדוגמה שלנו מכיל יותר ממחלקה עיקרית אחת, לכן עלינו לומר לג'אווה איזה מחלקה להריץ, על ידי הגדרת התוסף:

 org.springframework.boot spring-boot-maven-plugin com.baeldung.webjar.WebjarsdemoApplication 

או על ידי הגדרת ה- שיעור התחלה תכונה:

 com.baeldung.webjar.Webjarsdemo יישום 

4.2. הפעלת האפליקציה

כעת נוכל לנהל את המלחמה לדוגמה שלנו בשתי פקודות פשוטות:

$ mvn נקי חבילה אביב: אתחול מחדש $ java -jar target / spring-boot-ops.war

פרטים נוספים על אופן הפעלת קובץ jar ניתן למצוא במאמר שלנו הפעל יישום JAR עם ארגומנטים של שורת פקודה.

4.3. בתוך תיק המלחמה

כדי להבין טוב יותר כיצד הפקודה שהוזכרה לעיל יכולה להריץ יישום שרתים מלא, אנו יכולים להסתכל על שלנו spring-boot-ops.war.

אם אנו מבטלים את דחיסתו ומציצים פנימה, אנו מוצאים את החשודים הרגילים:

  • META-INF, עם אוטומטית שנוצרה MANIFEST.MF
  • WEB-INF / שיעורים, המכיל את השיעורים שלנו
  • WEB-INF / lib, המחזיקה בתלות המלחמה שלנו ובקבצי הצנצנת המוטמעים של Tomcat

זה לא הכל, שכן יש כמה תיקיות ספציפיות לתצורת חבילות השומן שלנו:

  • WEB-INF / lib מסופק, המכיל ספריות חיצוניות הנדרשות בעת הפעלת מוטבע אך אינן נדרשות בעת פריסה
  • org / springframework / boot / loader, המחזיקה את מטעין המחלקה המותאמת אישית של Spring Boot - ספרייה זו אחראית לטעינת התלות החיצונית שלנו ולהנגשתן בזמן ריצה

4.4. בתוך מניפסט המלחמה

כאמור, תוסף Maven Spring Boot מוצא את המעמד הראשי ויוצר את התצורה הדרושה להפעלת ה- ג'אווה פקודה.

כתוצאה מכך MANIFEST.MF יש כמה שורות נוספות:

מחלקת התחלה: com.baeldung.webjar.Webjarsdemo יישום מחלקה ראשית: org.springframework.boot.loader.WarLauncher

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

4.5. בתוך קובץ צנצנת

בשל אסטרטגיית האריזה המוגדרת כברירת מחדל, שלנו אריזות מלחמה התרחיש אינו שונה בהרבה, בין אם אנו משתמשים ב- תוסף Spring Boot Maven או שלא.

כדי להעריך טוב יותר את היתרונות של התוסף, נוכל לשנות את ה- pom אריזה תצורה ל קַנקַן ורוץ חבילה נקייה mvn שוב.

כעת אנו יכולים לראות כי צנצנת השומן שלנו מסודרת קצת אחרת מקובץ המלחמה הקודם שלנו:

  • כל תיקיות השיעורים והמשאבים שלנו נמצאים כעת תחת BOOT-INF / שיעורים
  • BOOT-INF / lib מחזיקה את כל הספריות החיצוניות

ללא התוסף, lib התיקיה לא הייתה קיימת, וכל התוכן של BOOT-INF / שיעורים יהיה ממוקם בשורש החבילה.

4.6. בתוך המניפסט של הצנצנת

וגם ה לְהַפְגִין.MF השתנה, כולל שורות נוספות אלה:

שיעורי אביב-אתחול: BOOT-INF / שיעורים / אביב-אתחול-ליב: BOOT-INF / lib / אביב-אתחול-גרסה: 2.1.3.RELEASE מחלקה ראשית: org.springframework.boot.loader.JarLauncher

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

5. כיצד לבחור

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

5.1. התפתחות

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

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

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

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

5.2. הפקה

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

הפעלת הקוד באמצעות Maven בשלב זה היא פרקטיקה גרועה מסיבות מרובות:

  • קודם כל, נצטרך להתקין את Maven
  • ואז, רק בגלל שאנחנו צריכים לקמפל את הקוד, אנחנו צריכים את ערכת הפיתוח המלאה של Java (JDK)
  • לאחר מכן עלינו להעתיק את בסיס הקוד לשרת שלנו ולהשאיר את כל הקוד הקנייני שלנו בטקסט רגיל
  • ה mvn על הפקודה לבצע את כל שלבי מחזור החיים (למצוא מקורות, לאסוף ולהפעיל)
  • בזכות הנקודה הקודמת היינו מבזבזים גם את המעבד ובמקרה של שרת ענן כסף
  • Maven משריץ מספר תהליכי Java, כל אחד מהם משתמש בזיכרון (כברירת מחדל, כל אחד מהם משתמש באותה כמות זיכרון כמו בתהליך האב)
  • לבסוף, אם יש לנו מספר שרתים לפרוס, כל האמור לעיל חוזר על עצמו בכל אחד מהם

אלה רק כמה סיבות לכך משלוח היישום כחבילה הוא פרקטי יותר לייצור.

6. מסקנה

במדריך זה בחנו את ההבדלים בין הפעלת הקוד שלנו באמצעות Maven דרך ה- java -jar פקודה. ערכנו גם סקירה מהירה של כמה תרחישים מקריים מעשיים.

קוד המקור המשמש במאמר זה זמין באתר GitHub.


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