טיפול ב- NoClassDefFoundError עבור JAXBException ב- Java 9

1. הקדמה

לכל מי שניסה לשדרג ל- Java 9, סביר להניח שהם חוו סוג כזה של NoClassDefFoundError בעת איסוף קוד שעבד בעבר בגרסאות קודמות של Java.

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

2. מדוע Java 9 לא יכול למצוא JAXBException?

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

החיסרון הוא שכיתות רבות כבר אינן זמינות בנתיב הכיתה כברירת מחדל. במקרה זה, הכיתה תפיסת JAXBEניתן למצוא באחד ממודולי ה- EE החדשים של ג'קרטה java.xml.bind. מכיוון שמודול זה אינו נדרש על ידי זמן הריצה המרכזי של Java, הוא אינו זמין בכיתה כברירת מחדל.

מנסה להריץ יישום שמשתמש בו תפיסת JAXBEיביא ל:

NoClassDefFoundError: javax / xml / bind / JAXBException

כדי לעקוף את זה עלינו לכלול את java.xml.bindמודול. כפי שנראה בהמשך, ישנן מספר דרכים להשיג זאת.

3. פיתרון לטווח קצר

הדרך המהירה ביותר לוודא ששיעורי ה- API של JAXB זמינים ליישום היא להוסיף להשתמש ב - להוסיף מודולים טיעון שורת פקודה:

- להוסיף מודולים java.xml.bind

עם זאת, זה לא יכול להיות פיתרון טוב מכמה סיבות.

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

כדי לעקוף את זה נוכל גם להשתמש ב- -XX: + התעלם מאופציות לא מזוהותטיעון שורת פקודה עבור מהדרי Java ישנים יותר.

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

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

4. פיתרון לטווח ארוך

יש גישה טובה יותר שתעבוד בגירסאות שונות של Java ולא תפרוץ עם המהדורות העתידיות.

הפיתרון הוא ל השתמש בכלי לניהול תלות כגון Maven. בגישה זו היינו מוסיפים את ספריית ה- JAXB API כתלות בדיוק כמו כל ספרייה אחרת:

 javax.xml.bind jaxb-api 2.3.0 

הספרייה הנ"ל מכילה רק את שיעורי ה- JAXB API, הכוללים תפיסת JAXBE. בהתאם ליישום ייתכן שנצטרך לכלול מודולים אחרים.

זכור גם שה- שמות חפצים של Maven עשויים להיות שונים משם מודול Java 9, כמו במקרה של JAXB API. ניתן למצוא אותו במייבן סנטרל.

5. מסקנה

מערכת המודול Java 9 מספקת מספר יתרונות כגון הקטנת גודל היישום וביצועים טובים יותר.

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


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