בעית "LINKAGE" חמורה בג'אווה

voguemaster

New member
בעית "LINKAGE" חמורה בג'אווה

יש לי בעיה כזו: יש לי אפליקציה שמורכבת מכמה מחלקות. אחת המחלקות היא מחלקת עזר כללית שרוב המחלקות האחרות משתמשות בה. אף אחד לא יורש ממחלקת העזר הזו ובאופן כללי היא לא משתנה בהרבה. בעידכון הלפני אחרון שעשיתי, עדכנתי שלוש מחלקות, אחת מהן היא מחלקת העזר (שלהזכירכם כולם משתמשים בה). פתאום התחלתי לקבל NoSuchMethodException באיזשהו מקום אחר לגמרי בקוד, בקריאה לפונקציה (שקיימת!). הדבר היחיד שיכלתי לחשוב עליו הוא שבגלל שהוספתי פונקציה למחלקת העזר שלי, דפקתי איכשהו את תהליך ה"קישור" שה-JVM עושה בזמן שהוא טוען את המחלקות. מה שעשיתי זה לעדכן את *כל* המחלקות וראיתי שהכל תקין. בעידכון הבא שעשיתי, עידכנתי רק את מחלקת העזר. השינוי היה מינורי - שיניתי בסה"כ מחרוזת אחת (היא מאותחלת במשהו קצת אחר עכשיו). קיבלתי NullPointerException במקום אחר ולא קשור לקוד הזה בכלל, כשמריצים את האפליקציה. אני יודע שיש חתימות לפונקציות בכל מחלקה וה-JVM בזמן טעינה אמור לבצע קישור כמו שצריך. כנראה שיש מקרים שבהם זה לא קורה ואני רוצה לגלות אותם. באופן עקרוני אמורה להיות אפשרות לעדכן קובץ או כמה קובצי class בלי לשבור את ההתנהגות של התוכנה לגמרי, לא ? מישהו מכיר מקרים של שבירת התנהגות כזו ? נדמה לי שראיתי פעם באיזה mailing list על הנושא הזה אבל אני לא זוכר איפה. מה שהכי מוזר זה שעשיתי עדכונים ספציפיים כאלה כבר פעם והכל עבד. מה גם שזה עובד על תחנה אחרת. אם יש באג, אני רוצה למצוא אותו אבל שינוי שעשיתי משפיע על קוד שלא קשור בכלל! אין לי מושג מה קורה
 

Zack DA

New member
תעשה clean לכל הפרוייקטים,

בנה אותם מחדש. תבדוק באילו jar-ים אתה משתמש, אולי חלקם לא עדכניים.
 

voguemaster

New member
לא עובד עם jar

ואני לא יכול לבצע clean במערכת שבה יש לי את הבעיה כי זו מערכת production . בכל אופן, ספציפית לגבי ה-NullPointerException גיליתי שזה אכן היה באג (לא שלי אבל באג הזוי של מקרה קצה
). השתפר מצב הפרנויה
 

Zack DA

New member
מצוין, אבל מה הקשר ל- NullPointerEx

? הרי היה לך NosuchMethodError. ומה זאת אומרת "לא יכול לעשות clean ? יש לך קבצי class ? מחק אותם !!
 

voguemaster

New member
צחי אתה קשה!

או שאני לא מסביר טוב
בפעם הראשון שעשיתי עדכון (לפני שגיליתי שאני צריך את כל הקבצים) היה לי NoSuchMethodException. הבעיה הייתה שכנראה בגלל שינויים מסוימים בקובץ השתנו החתימות מספיק וצריך שיהיו החתימות המתאימות בקובצי ה-class האחרים כדי שזה יעבוד. דרך טובה לדעת אם צריך לעדכן מחלקות אחרות היא בעזרת MD5 sum. אם אתה מקמפל את כל המחלקות שלך בבת אחת (נניח) ואתה רואה שעבור מחלקות שלא נגעת בהן (שמשתמשות במחלקת העזר) יש חתימה חדשה (כלומר בוצעו שינויים), אתה צריך לעדכן אותן. אם לא השתנו החתימות שבהן אתה תקבל תמיד את אותן חתימות MD5 גם אם תקמפל עשרים פעם. ככה אני פותר את הבעיה
לגבי ה-NULL. מסתבר שרק בשרת הספציפי ההוא היו שדות ב-DB שהכילו NULL. יש בו פשוט את מגוון הנתונים הגדול ביותר שיש לנו. זה שרת שמשמש אותנו לעבודה שוטפת מול לקוחות ולכן *אסור* לנו לבדוק עליו, לכן גם לא יכלתי לעלות על הבעיה של ה-NULL (שמקורה בקוד חדש שלא אני כתבתי) כי היא מופיעה שם ולא בשום שרת חדש שלנו. מסתבר גם שבמקרים מסוימים שלא אציין יש קריאה של אותם ה-NULLים מה-DB בזמן איתחול המערכת ולכן זה גרם לחריגה בזמן איתחול המערכת.. לא יכול לעשות clean כי זה שרת לטיפול בלקוחות באופן שוטף. אסור להוריד אותו ואסור להפסיק אותו מלבד לעידכונים. כמו שאמרתי גם אסור לבדוק עליו ולדבג עליו. מובן עכשיו ?
 

Zack DA

New member
כן, עכשיו הכל מובן ../images/Emo13.gif

פשוט לא הבנתי מה הקשר בין שני ה- errors, ועכשיו אני מבין שבאמת אין קשר....
 
למעלה