כיצד לפתור גרסת התנגשות חפצים במייבן

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

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

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

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

לבסוף, ננסה להשתמש ב- mתוסף aven-enforcer כדי להקל על השליטה בדברים, על ידי איסור על שימוש בתלות מעבר.

2. התנגשות גרסאות של חפצים

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

כתוצאה מכך, ייתכנו שגיאות ביישומים שלנו גם בשלב האוסף וגם בזמן הריצה.

2.1. מבנה הפרויקט

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

פרויקט התנגשות גרסה-פרויקט-ב פרויקט התנגשות 

ה pom.xml ל פרויקט-א ו פרויקט-ב כמעט זהים. ההבדל היחיד הוא הגרסה של com.google.guava חפץ שהם תלויים בו. באופן מיוחד, פרויקט-א משתמש בגרסה 22.0:

  com.google.guava גויאבה 22.0 

אבל, פרויקט-ב משתמש בגרסה החדשה יותר, 29.0-jre:

  com.google.guava גויאבה 29.0-jre 

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

  פרויקט com.baeldung-a 0.0.1-SNAPSHOT com.baeldung project-b 0.0.1-SNAPSHOT 

אז, איזו גרסה של גויאבה יהיה זמין ל פרויקט-התנגשות?

2.2. שימוש בתכונות מגרסת תלות ספציפית

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

@ מבחן ציבורי בטל כאשרVersionCollisionDoesNotExist_thenShouldCompile () {assertThat (Futures.immediateVoidFuture (), notNullValue ()); }

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

2.3. שגיאת אוסף הנגרמת על ידי התנגשות גרסה

תלוי בסדר התלות ב פרויקט-התנגשות מודול, בשילובים מסוימים Maven מחזיר שגיאת אוסף:

[שגיאה] ביצוע הכלי org.apache.maven.plugins נכשל: maven-compiler-plugin: 3.8.1: testCompile (ברירת מחדל-testCompile) על התנגשות פרויקט פרויקט: כשל באוסף [שגיאה] / הדרכות / maven-all / version -התנגשות / פרויקט התנגשות / src / מבחן / java / com / baeldung / גרסה / collision / VersionCollisionUnitTest.java: [12,27] לא יכול למצוא סמל [ERROR] סמל: השיטה instantVoidFuture () [ERROR] מיקום: com com. google.common.util.concurrent.Futures

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

2.4. באמצעות תוסף maven-dependency

ה תוסף maven-dependency הוא כלי מועיל מאוד להצגת כל התלות והגרסאות שלהם:

תלות% mvn: עץ -Dverbose [INFO] --- תוסף תלות maven: 2.8: עץ (ברירת מחדל-cli) @ התנגשות פרויקט --- [INFO] com.baeldung: פרויקט-התנגשות: צנצנת: 0.0.1 -SNAPSHOT [INFO] + - com.baeldung: project-a: jar: 0.0.1-SNAPSHOT: compile [INFO] | \ - com.google.guava: גויאבה: צנצנת: 22.0: הידור [INFO] \ - com.baeldung: project-b: צנצנת: 0.0.1-SNAPSHOT: הידור [INFO] \ - (com.google.guava: גויאבה : צנצנת: 29.0-jre: קומפילציה - הושמט לסכסוך עם 22.0)

ה -דברבוז דגל מציג חפצים סותרים. למעשה, יש לנו com.google.guava תלות בשתי גרסאות: 22.0 ו- 29.0-jre. האחרון הוא זה שנרצה להשתמש בו פרויקט-התנגשות מודול.

3. לא לכלול תלות מעבר מממצא

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

לכן, אנו יכולים להחריג זאת ב- פרויקט-התנגשות פום:

  פרויקט com.baeldung-a 0.0.1-SNAPSHOT com.google.guava guava com.baeldung project-b 0.0.1-SNAPSHOT 

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

תלות% mvn: עץ -Dverbose [INFO] --- תוסף תלות maven: 2.8: עץ (ברירת מחדל-cli) @ התנגשות פרויקט --- [INFO] com.baeldung: פרויקט-התנגשות: צנצנת: 0.0.1 -SNAPSHOT [INFO] \ - com.baeldung: project-b: jar: 0.0.1-SNAPSHOT: compile [INFO] \ - com.google.guava: guava: jar: 29.0-jre: compile

כתוצאה מכך, שלב האוסף מסתיים ללא שגיאה ונוכל להשתמש בכיתות ובשיטות מהגרסה 29.0-jre.

4. באמצעות תלות ניהול סָעִיף

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

עם זאת, בואו ניצור תלות ניהול תצורה אצל ההורה שלנו פום:

   com.google.guava גויאבה 29.0-jre 

כתוצאה מכך, Maven ידאג להשתמש בגרסה 29.0-jre שֶׁל com.google.guava חפץ בכל המודולים לילדים:

תלות% mvn: עץ -Dverbose [INFO] --- תוסף תלות maven: 2.8: עץ (ברירת מחדל-cli) @ התנגשות פרויקט --- [INFO] com.baeldung: פרויקט-התנגשות: צנצנת: 0.0.1 -SNAPSHOT [INFO] + - com.baeldung: project-a: jar: 0.0.1-SNAPSHOT: compile [INFO] | \ - com.google.guava: גויאבה: צנצנת: 29.0-jre: קומפילציה (גרסה מנוהלת מ- 22.0) [INFO] \ - com.baeldung: project-b: jar: 0.0.1-SNAPSHOT: הידור [INFO] \ - (com.google.guava: guava: jar: 29.0-jre: compile - גרסה מנוהלת החל מה 22.0; הושמטה לשכפול)

5. למנוע תלות מעבר מעבר בשוגג

ה תוסף maven-enforcer מספק כללים מובנים רבים ש לפשט את הניהול של פרויקט רב-מודולי. אחד מהם אוסר על שימוש בשיעורים ובשיטות מתלות מעבר.

הצהרת תלות מפורשת מסירה את האפשרות להתנגשות גרסאות בחפצים. בואו נוסיף את תוסף maven-enforcer עם הכלל הזה לפום ההורים שלנו:

 org.apache.maven.plugins maven-enforcer-plugin 3.0.0-M3 אוכף תלות אסורה 

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

6. מסקנה

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

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

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

לבסוף ניסינו את תוסף maven-enforcer לאסור את השימוש בתלות מעבר על מנת לאלץ כל מודול להשתלט על עצמו.

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


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