מדריך Apache Maven

1. הקדמה

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

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

במדריך זה נלך לחקור את הכלי החזק הזה לתיאור, בנייה וניהול של פרויקטים של תוכנת Java באמצעות פיסת מידע מרכזית - מודל אובייקט פרויקט (POM) - שנכתב ב- XML.

2. מדוע להשתמש ב- Maven?

התכונות העיקריות של Maven הן:

  • הגדרת פרויקט פשוטה העוקבת אחר שיטות עבודה מומלצות: Maven מנסה להימנע ככל האפשר מתצורה, על ידי אספקת תבניות פרוייקט (בשם ארכיטיפים)
  • ניהול תלות: זה כולל עדכון אוטומטי, הורדה ואימות התאימות, וכן דיווח על סגירת תלות (המכונה גם תלות מעבר)
  • בידוד בין תלות בפרויקט לבין תוספים: עם Maven, תלות בפרויקט מתקבלת מה- מאגרי תלות בעוד שתלות של כל תוסף נשלפים מה- מאגרי תוספים, וכתוצאה מכך פחות סכסוכים כאשר תוספים מתחילים להוריד תלות נוספות
  • מערכת מאגר מרכזי: ניתן לטעון תלות בפרויקט ממערכת הקבצים המקומית או ממאגרים ציבוריים, כגון Maven Central
על מנת ללמוד כיצד להתקין את Maven במערכת שלך, אנא עיין במדריך זה על Baeldung.

3. מודל אובייקט פרויקט

התצורה של פרויקט Maven מתבצעת באמצעות מודל אובייקט פרויקט (POM), מיוצג על ידי א pom.xml קוֹבֶץ. ה POM מתאר את הפרויקט, מנהל תלות ומגדיר תוספים לבניית התוכנה.

ה POM מגדיר גם את היחסים בין מודולים של פרויקטים מרובי-מודולים. בואו נסתכל על המבנה הבסיסי של טיפוסי POM קוֹבֶץ:

 4.0.0 org.baeldung צנצנת org.baeldung 1.0-SNAPSHOT org.baeldung //maven.apache.org junit junit 4.12 test // ... 

בואו נסתכל מקרוב על המבנים האלה.

3.1. מזהי פרויקטים

Maven משתמש בקבוצת מזהים, הנקראים גם קואורדינטות, כדי לזהות פרויקט באופן ייחודי ולציין כיצד יש לארוז את חפץ הפרויקט:

  • groupId - שם בסיס ייחודי של החברה או הקבוצה שיצרו את הפרויקט
  • artifactId - שם ייחודי של הפרויקט
  • גִרְסָה - גרסת הפרויקט
  • אריזה - שיטת אריזה (למשל מִלחָמָה/קַנקַן/רוכסן)

שלוש הראשונות של אלה (groupId: artifactId: גרסה) לשלב כדי ליצור את המזהה הייחודי ומהווים את המנגנון שבאמצעותו אתה מציין באילו גרסאות של ספריות חיצוניות (למשל JAR) הפרויקט שלך ישתמש.

3.2. תלות

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

זוהי תכונה מרכזית של Maven ומספקת את היתרונות הבאים:

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

על מנת להכריז על תלות בספריה חיצונית, עליך לספק את ה- groupId, artifactId, וה גִרְסָה של הספרייה. בואו נסתכל על דוגמה:

 org.springframework spring-core 4.3.5.RELEASE 

כאשר Maven מעבד את התלות, הוא יוריד את ספריית Spring Core למאגר Maven המקומי שלך.

3.3. מאגרים

מאגר ב- Maven משמש לאחסון חפצי בנייה ותלות מסוגים שונים. המאגר המקומי המוגדר כברירת מחדל ממוקם ב- .m2 / מאגר בתיקיה הביתית של המשתמש.

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

ספריות מסוימות, כמו שרת JBoss, אינן זמינות במאגר המרכזי אך זמינות במאגר חלופי. עבור ספריות אלה, עליך לספק את כתובת האתר למאגר החלופי שבתוכה pom.xml קוֹבֶץ:

  מאגר JBoss //repository.jboss.org/nexus/content/groups/public/ 

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

3.4. נכסים

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

נכסי Maven הם בעלי ערכי מקום והם נגישים בכל מקום בתוך pom.xml באמצעות הסימון $ {name}, איפה שֵׁם הוא הנכס.

בואו נראה דוגמה:

 4.3.5.RELEASE org.springframework spring-core $ {spring.version} org.springframework spring-context $ {spring.version} 

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

תכונות משמשות לעתים קרובות גם להגדרת משתני נתיב בנייה:

 $ {project.build.directory} / tmp / // ... $ {project.resources.build.folder} // ... 

3.5. לִבנוֹת

ה לִבנוֹת החלק הוא גם קטע חשוב מאוד במאבן POM. הוא מספק מידע על ברירת המחדל של Maven מטרה, הספריה של הפרויקט המהולל, ואת השם הסופי של היישום. ברירת המחדל לִבנוֹת החלק נראה כך:

 התקן $ {basedir} / target $ {artifactId} - $ {version} מסננים / filter1.properties // ... 

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

3.6. באמצעות פרופילים

מאפיין חשוב נוסף של Maven הוא התמיכה בו פרופילים. א פּרוֹפִיל הוא בעצם קבוצה של ערכי תצורה. על ידי שימוש ב פרופילים, אתה יכול להתאים אישית את המבנה לסביבות שונות כגון ייצור / בדיקה / פיתוח:

  ייצור // ... פיתוח נכון // ... 

כפי שניתן לראות בדוגמה לעיל, פרופיל ברירת המחדל מוגדר כ- התפתחות. אם אתה רוצה להפעיל את הפקה פּרוֹפִיל, אתה יכול להשתמש בפקודה Maven הבאה:

mvn נקי להתקין - ייצור

4. Maven Build Lifecycles

כל מבנה של Maven עוקב אחר הוראות מפורטות מעגל החיים. אתה יכול לבצע מספר build מעגל החייםמטרות, כולל אלה ל לְלַקֵט את קוד הפרויקט, צור חֲבִילָה, ו להתקין את קובץ הארכיון במאגר התלות המקומי של Maven.

4.1. שלבי מחזור חיים

הרשימה הבאה מציגה את מייבן החשוב ביותר מעגל החיים שלבים:

  • לְאַמֵת - בודק את נכונות הפרויקט
  • לְלַקֵט - מרכיב את קוד המקור שסופק לממצאים בינאריים
  • מִבְחָן - מבצע בדיקות יחידה
  • חֲבִילָה - חבילות קוד מקובץ לקובץ ארכיון
  • מבחן האינטגרציה - מבצע בדיקות נוספות, המחייבות את האריזה
  • תאשר - בודק אם החבילה תקפה
  • להתקין - מתקין את קובץ החבילה במאגר Maven המקומי
  • לפרוס - פורס את קובץ החבילה לשרת או מאגר מרוחק

4.2. תוספים ו מטרות

מאבן חיבור הוא אוסף של אחד או יותר מטרות. היעדים מבוצעים בשלבים, מה שעוזר לקבוע את הסדר שבו ה- מטרות מוצאים להורג.

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

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

כדי לעבור על כל אחד מהשלבים שלעיל, עלינו להתקשר לפקודה אחת:

mvn 

לדוגמה, mvn נקי להתקין יסיר את קבצי הצנצנת / מלחמה / zip והשיעורים המהוללים בעבר (לְנַקוֹת) ולבצע את כל השלבים הדרושים להתקנת ארכיון חדש (להתקין).

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

5. פרויקט Maven הראשון שלך

בחלק זה נשתמש בפונקציונליות שורת הפקודה של Maven כדי ליצור פרויקט Java.

5.1. יצירת פרויקט Java פשוט

על מנת לבנות פרויקט Java פשוט, בוא נפעיל את הפקודה הבאה:

ארכיטיפ mvn: ליצור -DgroupId = org.baeldung -DartifactId = org.baeldung.java -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

ה groupId הוא פרמטר המציין את הקבוצה או האדם שיצרו פרויקט, שלעתים קרובות הוא שם דומיין של חברה הפוכה. ה artifactId הוא שם חבילת הבסיס המשמש בפרויקט, ואנו משתמשים בתקן אַב טִיפּוּס.

מכיוון שלא ציינו את הגרסה ואת סוג האריזה, אלה יוגדרו לערכי ברירת מחדל - הגרסה תוגדר כ- 1.0-SNAPSHOT, והאריזה תוגדר ל- קַנקַן.

אם אינך יודע אילו פרמטרים לספק, תוכל תמיד לציין InteractiveMode=נָכוֹן, כך שמייב מבקש את כל הפרמטרים הנדרשים.

לאחר השלמת הפקודה, יש לנו פרויקט Java המכיל App.java בכיתה, שהיא פשוט תוכנית פשוטה "שלום עולם", ב src / main / java תיקיה.

יש לנו גם שיעורי מבחן לדוגמא src / test / java. ה pom.xml של פרויקט זה ייראה דומה לזה:

 4.0.0 צנצנת org.baeldung org.baeldung.java 1.0-SNAPSHOT org.baeldung.java //maven.apache.org מבחן junit junit 4.1.2 

כפי שאתה יכול לראות, צומת התלות מסופקת כברירת מחדל.

5.2. קומפילציה ואריזת פרויקט

השלב הבא הוא להרכיב את הפרויקט:

לקמפל mvn

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

מבחן mvn

עכשיו בואו נקרא את חֲבִילָה שלב, אשר יפיק את הארכיון המהולל קַנקַן קוֹבֶץ:

חבילת mvn

5.3. ביצוע יישום

לבסוף, אנו הולכים לבצע את פרויקט Java שלנו באמצעות תוסף exec-maven. בואו להגדיר את התוספים הדרושים ב- pom.xml:

 src maven-compiler-plugin 3.6.1 1.8 1.8 org.codehaus.mojo exec-maven-plugin 1.5.0 org.baeldung.java.App 

התוסף הראשון, תוסף maven-compiler, אחראית על קומפילציה של קוד המקור באמצעות Java גרסה 1.8. ה תוסף exec-maven מחפש אחר mainClass בפרויקט שלנו.

כדי לבצע את היישום, אנו מפעילים את הפקודה הבאה:

mvn exec: java

6. פרויקטים מרובי-מודולים

המנגנון ב- Maven המטפל בפרויקטים מרובי-מודולים (נקרא גם צובר פרויקטים) נקרא ראוקטור.

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

בואו נראה כיצד ליצור פרויקט הורה רב-מודולי.

6.1. צור פרויקט הורה

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

ארכיטיפ mvn: צור -DgroupId = org.baeldung -DartifactId = פרויקט אב

לאחר מכן אנו מעדכנים את סוג האריזה בתוך ה- pom.xml קובץ כדי לציין שזהו הוֹרֶה מודול:

פום

6.2. צור פרויקטים של תת-מודול

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

פרויקט אב של cd mvn ארכיטיפ: ליצור -DgroupId = org.baeldung -DartifactId = ליבה mvn archetype: ליצור -DgroupId = org.baeldung -DartifactId = שירות mvn ארכיטיפ: ליצור -DgroupId = org.baeldung -DartifactId = webapp

כדי לוודא אם יצרנו את תת המודולים בצורה נכונה, נסתכל ב פרויקט הורים pom.xml קובץ, שם עלינו לראות שלושה מודולים:

 שירות ליבה 

יתר על כן, יתווסף קטע הורים בכל תת מודול pom.xml:

 פרויקט הורים org.baeldung 1.0-SNAPSHOT 

6.3. אפשר ניהול תלות בפרויקט האב

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

כשיש לך קבוצה של פרויקטים או מודולים שירשו הורה משותף, אתה יכול להכניס את כל המידע הנדרש אודות התלות במשותף pom.xml קוֹבֶץ. זה יפשט את ההתייחסויות לחפצים אצל הילד POMס.

בואו נסתכל על ההורה לדוגמא pom.xml:

   org.springframework spring-core 4.3.5.RELEASE // ... 

על ידי הכרזה על ליבת קפיץ גרסה אצל ההורה, כל תת המודולים שתלויים ב ליבת קפיץ יכול להכריז על התלות רק באמצעות groupId ו artifactId, והגרסה תועבר בירושה:

  org.springframework spring-core // ... 

יתר על כן, אתה יכול לספק אי הכללות לניהול תלות אצל ההורה pom.xml, כדי שספריות ספציפיות לא תורשנה על ידי מודולים צאצאיים:

  org.springframework spring-context 

לבסוף, אם מודול צאצא צריך להשתמש בגרסה אחרת של תלות מנוהלת, באפשרותך לעקוף את הגירסה המנוהלת של הילד pom.xml קוֹבֶץ:

 org.springframework קפיץ הליבה 4.2.1.RELEASE 

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

למידע נוסף על ירושה וצבירה אנא עיין בתיעוד זה.

6.4. עדכון מודולי המשנה ובניית פרויקט

אנחנו יכולים לשנות את אריזה סוג של כל תת מודול. לדוגמה, בואו לשנות את אריזה של ה webapp מודול ל מִלחָמָה על ידי עדכון pom.xml קוֹבֶץ:

מִלחָמָה

כעת אנו יכולים לבדוק את בניית הפרויקט שלנו באמצעות ה- mvn נקי להתקין פקודה. הפלט של יומני Maven צריך להיות דומה לזה:

[INFO] סריקה לפרויקטים ... [INFO] סדר בניית כור: [INFO] פרויקט אב [INFO] ליבה [INFO] שירות [INFO] webapp // ............. [ INFO] ---------------------------------------- [INFO] סיכום הכור: [ INFO] ----------------------------------------- [INFO] פרויקט הורים. ................. הצלחה [2.041 שניות] [INFO] ליבת ........................ .... הצלחה [4.802 שניות] שירות [INFO] ......................... הצלחה [3.065 שניות] [מידע] אפליקציית אינטרנט ... ....................... הצלחה [6.125 שניות] [INFO] ------------------- ----------------------

7. מסקנה

במאמר זה דנו בכמה מהתכונות הפופולריות יותר של כלי הבנייה Apache Maven.

כל דוגמאות הקוד ב- Baeldung בנויות באמצעות Maven, כך שתוכלו לבדוק בקלות באתר הפרויקט GitHub שלנו כדי לראות תצורות שונות של Maven.