עולם הג'אווה הוא בעיקרון עולם משעמם למדי.
ג'אווה בהחלט הייתה טכנולוגיה חדשנית ומרגשת - אך זה היה לפני כ 20 שנה.
מאז גרסאות של ג'אווה שוחררו בקצב של אחת לכמה שנים, עם חידושים מעטים - יחסית לשפות אחרות: #C המקבילה, רובי, Go, ג'אווהסקריפט כמובן (שלא בטוח שקצב השינויים היה רק לטובה), סקאלה, קוטלין, Clojure, ועוד.
כבר לפני כמה שנים שמעתי על השוואה בין ג'אווה לקובול - שפה שחלשה על חלקים גדולים מהתעשייה, אך עם הזמן הפכה למיושנת להחריד.
החברה שפיתחה את ג'אווה במקור (Sun Microsystems) כשלה עסקית ונרכשה ע"י Oracle בשנת 2010 - שקיבלה את הנכס הנדיר שנקרא ג'אווה, אך נכס שגם דורש השקעה רבה ומחולק בחינם בעולם.
הגרסה המשמעותית האחרונה של ג'אווה הייתה גרסה 8, ששוחררה ב 2014 - ואכן הציגה כמה חידושים יפים.
הגרסה המשמעותית הבאה של ג'אווה, גרסה 11 - עומדת להיות משוחררת בימים אלו והיא מייצרת סוג של "רעידת אדמה קטנה" בסביבה שיציבות והמשכיות - היו על לאחרונה עקרונות ברזל שלה.
כשאנו מדברים על שינוים אנחנו לא מדברים רק על שינוים בשפת ג'אווה עצמה - אלא בעיקר על שינויים בפלטפורמת ה JVM, פלטפורמה שמשרתת את Scala, Closure, קוטלין, Groovy, JRuby, ועוד. חשוב לזכור שה JVM הוא גדול יותר מג'אווה.
ג'אווה גרסה 9 היא נקודת ציון בהיסטורית הגרסאות של ג'אווה - למרות שהיא עצמה חסרת חשיבות לחלוטין. ג'אווה 9 החלה כמה שינויים גדולים המגיעים לידי מימוש בגרסה 11 שיוצאת עכשיו (ספטמבר 2018):
גרסה 9 הציגה לראשונה התחלה של כל השינויים הנ"ל, אך הוכרז מראש שזו גרסה שתתמך לחצי-שנה בלבד, וגרסת היעד לתמיכה ארוכה (LTS, כלומר Long-term support) תהיה גרסה 11.
מאז יצאה גם ג'אווה 10 - גם היא גרסה מינורית ולא כ"כ נוספת, שסיפקה עוד כמה התקדמויות בנושאים הנ"ל (ומספר תוספות קטנות לשפה) - אבל חשיבות הגרסה הייתה בהיותה הכנה גנרלית לשחרור גרסה 11.
גרסה 11 היא זו שתעמת את קהילת ה JVM בפעם הראשונה באמת עם מציאות חדשה, והדילמות שנובעות ממנה. זו גרסת LTS שתתמך עכשיו עד 8 שנים קדימה, גרסת ג'אווה המשמעותית שתהיה זמינה בשנים הקרובות.
אם התיאור הנ"ל משאיר אתכם עם סימני שאלה - זה מובן לחלוטין. אנסה להתחיל ולענות על השאלות העיקריות שצצות מהשינויים הללו.
מה ההבדל בעצם בין OpenJDK ו OracleJDK? ומה השתנה?
החל מגרסה 7 החלה להיות משוחררת ההפצה של OpenJDK, שהיא הפצה תחת רישיון GNU GPL v2 עם החרגה ל linking - רישיון Open Source חופשי, המאפשר שימוש בג'אווה בכדי לכתוב תוכנה מסחרית ולמכור אותה.
היוזמה הייתה עוד של חברת Sun, והגנה על האופי הפתוח של ג'אווה.
אורקל מציעה גם "הפצה משופרת" של ג'אווה ברישיון מסחרי בשם OracleJDK הכוללת עוד כמה ספריות (בעיקר מסביב לטכנולוגיית JavaFX, שלא תפסה) ו tooling שהגיע עם ההפצה כמו כלי ניטור ובדיקות ביצועים. הכוונה הייתה כנראה כן להפיק הכנסות מג'אווה - אך ההצלחה לא הייתה גדולה.
החל מגרסה 9, הפצות ה OpenJDK וה OracleJDK מתאחדות. זה לא יקרה ע"י הסרה של תוכן מתוך ה OracleJDK אלא בעיקר ע"י פתיחה של התוספות שאורקל סיפקה להיות OpenSource. כמה תכונות עם רישיון מסחרי (כמו ה Java Web Start) אכן יוסרו מה JDK, אבל בעיקר בגלל שהאימוץ שלהן נמוך למדי. התהליך מסתיים עכשיו בשחרור גרסה 11, בו תוכן ההפצות הוא זהה - וההבדל ביניהן הוא רק הרישיון.
למה לי לשלם לאורקל כסף על מה שזמין בחינם וזוכה לתמיכה של הקהילה (כלומר: OpenJDK)?
שאלה מצוינת! ביחד עם ההחלטה ליישר בין ההפצות, יש החלטה יותר משמעותית לצמצם את התמיכה שאורקל סיפקה ל OpenJDK בחינם. כלומר: קיבלנו (אנחנו הקהילה) עוד כמה ספריות וכלים (כגון Flight Recorder ו Mission Control - כלי בעל יכולות לניטור ביצועים על מערכת חיה לאורך), אבל אנחנו מפסיקים לקבל מאורקל תיקוני באגים ותיקוני אבטחה זמן ארוך לאחר שגרסת הג'אווה שוחררה. מעתה - התיקונים שאורקל תספק ל OpenJDK בחינם יהיו רק לפרקי זמן קצרים לאחר שחרור הגרסה.
אם הדבר היה נתון לבחירת המשתמשים - נראה שכמעט כל המשתמשים היו מעדיפים את המצב הקודם. במהלך הזה אורקל "דוחפת" את המשתמשים לרכוש ממנה (או מספקי צד-שלישי) תמיכה בתשלום לג'אווה.
להגנתה של אורקל יאמר שהיא כנראה משקיעה בג'אווה הרבה יותר ממה שהיא מרוויחה ממנה, וזה סה"כ לגיטימי להפסיק להיות פילנטרופ.
כיצד אורקל עומדת לצמצם את התמיכה שמסופקת ב OpenJDK וכיצד זה קשור למחזור שחרור הגרסאות החדש?
ג'אווה 9 הציגה מחזור חדש של שחרור גרסאות שנראה כך:
לגרסה 8 של ג'אווה, אורקל סיפקה תיקוני-באגים ותיקוני אבטחה בחינם למשך כחמש שנים. התמיכה מסתיימת, חשוב לציין, בינואר 2019. בקרוב מאוד.
החל מגרסה 9, אורקל מתחייבת שחרר גרסה פעמיים בשנה, מה שיאפשר לשחרר תוספות לשפה וה JVM בתדירות גבוהה יותר.
הבחירה במספרים שלמים עבור הגרסאות הללו לא מצביע על כמות התוכן שיתווסף, אלא על אופנה של השנים האחרונות ״לרוץ״ עם מספרי גרסאות (למשל: ראקט הייתה בגרסה 0.14 לפני שלוש שנים - אך כיום היא כבר בגרסה 16.5. אנגולר הייתה בגרסה 2.0 ב 2014, אך עוד מעט משתחררת גרסה 7.0).
מכיוון שה JVM הוא תשתית קריטית למערכת שרצה עליו, סביר שרוב הארגונים לא יסכימו לעדכן גרסאות מיד לכשיצאו (אלא אם יוכח שהגרסאות החדשות שמשתחררות הן יציבות בצורה מופלאה - מה שיהווה הפתעה), ולכן יהיו גם גרסאות LTS שימשיכו לקבל עדכונים ותיקונים לטווח ארוך יותר, גם כאשר יש גרסה חדשה יותר זמינה.
רוצים תזכורת מה יכול להשתבש בגרסה חדשה של JDK? הנה דוגמה לבאג שהוצג בגרסה 9 של ה JDK:
תיקוני באגים ותיקוני אבטחה ישוחררו רק על הגרסה האחרונה (בחינם), או על גרסאות LTS (בתשלום). אם חשוב לנו לקבל עדכונים שוטפים יש לנו שלוש ברירות:
באמת היא כנראה איפשהו באמצע. אורקל מצהירה שכל גרסה שתשוחרר תעבור Quality cycle מפרך כמו של גרסה מ'אגורית עד היום. כמו כן יש הצהרה שהיא תשחרר לפחות שני עדכונים (תיקוני באגים ואבטחה) מינוריים - לכל גרסה שתצא. גרסאות שאינן LTS הן לא גרסאות "בטא" - ע"פ ההצהרה.
סביר להניח ששחרור גרסאות תכוף יאפשר לג'אווה להתפתח מהר יותר - אך במידה. מי שצפוי לעבוד באמת עם גרסאות שאינן LTS הוא רק פלח צר של Early adopters (למשל: סטארטאפ בתחילת דרכו), במיוחד בשנים הראשונות.
האם מה שאורקל עושה הוא "בסדר"? האם זה לא "מחטף מרושע"?
אין לי תשובה ברורה. בד"כ כשארגון רוצה לקבל הכנסות מפרויקט Open Source - הוא מציע ערך נוסף על הקיים בכדי לקבל עליו תשלום: Premium support או יכולות נוספות (למשל: Redis modules).
אורקל בעצם ממשיכה לגבות תשלום על תמיכה, תוך כדי שהיא מפסיקה בפועל את התמיכה-בחינם שהיא סיפקה לאורך שנים רבות. אם היה מדובר בפרויקט קטן - זה אולי לא היה מתקבל בשמחה, אך זה לא היה עושה הרבה רעש. ג'אווה היא אחת מהתשתיות (ביחד עם לינוקס, MySQL ועוד כמה) המשמעותיות ביותר המסופקות בחינם. ההשפעה - היא משמעותית!
נקודת סולידריות מסוימת היא כן ההשקעה הגדולה שאורקל סיפקה לאורך שנים - ובחינם.
מנקודת מבט מסוימת, אורקל מפנה מקום לקהילה / חברות צד-שלישי לקחת על עצמן את האחריות במתן תמיכה לג'אווה בחינם. יבמ, גוגל, וסאפ הן 3 חברות גדולות, עם עניין עמוק בג'אווה שיכלו לעשות זאת - אך אף אחת לא התנדבה.
אורקל כמובן לא מוותרת על ג'אווה - ומשאירה את "גרעין השליטה" על הטכנולוגיה - אצלה. אפשר לומר שמתקבל על הדעת להניח שהמהלך של אורקל בא לצמצם עלויות שאורקל לא חפצה בהן, וזו לא "תוכנית זדונית לסחוט מהעולם כמה כסף שאפשר". לא נראה שאורקל ניסתה לחסום ספקי צד-שלישי לתת תמיכה בתשלום לג'אווה, וכך בעצם להתחרות ב OracleJDK offering שלה.
כאב ראש לאנשים רבים בעולם - ככל הנראה ייגרם בכל זאת.
דיברנו על איזו בעיה של תאימות לאחור, במה בדיוק מדובר?
ג'אווה 9 הציגה לראשונה את ה Module System (הידוע לשעבר כ Project Jigsaw או super packages) - כלי מודולריזציה בשפה.
packages, כלי ארגון הקוד עד עכשיו, הוא כלי נחמד - אבל עם מגבלה עיקרית: הוא עוזר לארגן את תוך ה package (למשל: ניתן להגדיר מחלקות כ private ל package) אך הוא לא מתמודד עם ניהול תלויות בין packages.
במעבר מ Java 8 ל Java 11, אורקל חילקה את ה JDK לכ 80 מודולים שונים, חלקים יצאו מה JDK ויהיו זמינים כספרייה נפרדת, או שנפרד מהם לגמרי. הנה רשימת היכולות שהוסרו מה JDK:
בנוסף, בג'אווה 9 עד 11 הסירו כמה פונקציות שהיו deprecated לאורך זמן רב. זו הפעם הראשונה בהיסטוריה של ג'אווה שקוד באמת מוסר מה JDK.
אם אתם משתמשים באחת מהטכנולוגיות או ה APIs שהוסרו מה JDK - יהיה עליכם ליבא אותן בצורה מפורשת (למשל: באמצעות מייבן) או למצוא חלופה (למשל ל Applets או Nashron - שלא ייתמכו יותר).
המודולריזציה של ה JDK תסייע גם להלחם בצריכת הזיכרון הגבוהה של ג'אווה, ובגודל ה distributables. ג'אווה עובדת עם Dynamic linking (קישור של קוד בזמן ריצה, ולא בזמן קומפילציה). יש בכך כמה יתרונות (קל מאוד לייצר Plugin architecture, ניתן לבצע אופטימזציות מסוימות) אבל המחיר הוא קבצי jars גדולים מהנדרש (אנו כוללים את כל הקוד בספריה, אפילו אם אנו זקוקים רק ל 5% ממנה) וגם צריכת זיכרון גבוהה יותר.
בעולם ה micro-services וה FaaS (למשל: AWS lambda) - התכונות הללו הן מגבלה רצינית של ג'אווה. למבדה קטנה בג'אווה יכולה בקלות לדרוש jar file של עשרות MB ולצרוך מאות MBs של זיכרון. למבדה דומה ב ++C או Go תדרוש שבריר מהמשאבים של ג'אווה. כנ"ל לגבי ג'אווהסקריפט או פייטון - אבל מסיבות קצת שונות.
ג'אווה 9 הוסיפה כלי בשם jlink המאפשר לבנות אפליקציית ג'אווה עם static linking. השימוש העיקרי הוא FaaS או הפצה של ג'אווה למכשירים עם מגבלות במשאבים. החיסרון של jlink הוא שהתוצר לא ניתן לעדכון ללא החלפה מלאה של התוצר הבינרי. היום ניתן לעדכן גרסאת JRE ולקבל עדכוני אבטחה / באגים קריטיים מבלי לעדכן את קוד האפליקציה. אפליקציה שנבנתה עם jlink תדרוש בנייה מחדש ו deploy מחדש - על מנת להחיל את אותם העדכונים.
הסכנה שבשינוי
מעבר בין גרסאות ג'אווה בדרך-כלל לא היה עניין גדול, אולי צריך להחליף בקוד משתנים ופונקציות השתמשו בשם שם מילה שמורה חדשה.
המעבר בין ג'אווה 8 לג'אווה 11, או בין JDK 8 ל JDK 11 (למי שמשתמש בשפת JVM שאיננה ג'אווה) - עומד להיות עניין גדול יותר.
רבים מהכלים וספריות של ג'אווה דרשו עדכון על מנת לתמוך ב MDS. סביר להניח שעל מנת להשתמש בג'אווה 11 בעצמכם, יהיה עליכם לעדכן גרסאות של ספריות לגרסאות שעשו כבר את המעבר.
כפי שאתם יודעים, עדכון גרסה של ספריה הוא לפעמים שינוי של שורה בכלי ניהול התלויות (גריידל או מייבן, למשל), אבל לעתים נדרשים שינויים גדולים בקוד - שיכולים להיות מורכבים. כל השינויים הללו שדחינו כבר חודשים רבים...
הסכנה שבחובה לעדכן, אפילו אם זה שינוי קטן, הוא שספריה שאתם תלויים בה - איננה מעודכנת. לבחור שמתחזק אותה לא הייתה חצי שעה לסגור את הסיפור קצה לקצה.
הבעיה הזו היא טרנזיטיבית, כך שאם אתם משתמשים בספריה שמשתמשת בספריה, שמשתמשת בספריה אחרת שלא עודכנה - יכול להיות שנתקעתם.
בואו ניזכר שנייה מה קרה בפייטון:
ראשי הקהילה תיארו זאת כך:
"באותה תקופה שעבדנו על פייטון 3 - השימוש בפייטון בעולם צמח בקצב מהיר מאוד. הנחנו שבשל המגמה, יהיה יותר קוד בפייטון 3 מאשר בפייטון 2 תוך מספר שנים - ולכן החלטנו "לספוג את הכאב" שבמעבר לא-תואם לאחור בכוונה לייצר עתיד טוב יותר לקהילת הפייטון. היום ברור שיעבור עוד עשור או יותר - עד שיהיה יותר קוד פייטון 3 מאשר קוד פייטון 2".
התוכנית לא כ"כ הצליחה: בסיסי קוד שברמת תחזוקה / שליטה בקוד גבוהה - היה ניתן להמיר במאמץ לא גדול - אבל המפתחים לא המירו את הקוד - כי ספריות רבות שהשתמשו בהן עדיין לא עברו לפייטון 3.
מתחזקי ספריות ותיקות כבר הפחיתו את ההשקעה בספריה - ולא היו מוכנים לעשות את המעבר. גם להם היו לפעמים ספריות אחרות שהם תלויים בהן - שלא ביצעו מעבר לפייטון 3. ה Distros העיקריים של לינוקס המשיכו להיות מסופקים עם פייטון 2 - וחוזר חלילה.
וכך - כל העגלה נתקעה. קריאה לקהילה לבצע את המעבר לא נענתה בחיוב, או לפחות לא בקצב מהיר. הוקמו אתרים כמו http://py3readiness.org ו http://python3wos.appspot.com שמדדו ועודדו - את האימוץ של פייטון 3.
פייטון 3 שוחררה ב 2008, אבל לקח בערך עשור עד שרוב הקהילה הצליחה לעשות את המעבר.
-----------------
השינויים הנדרשים במעבר מג'אווה 8 לג'אווה 11 - הם קטנים יותר משמעותית מאלו שהיו בפייטון 3. בעיקר צריך לעדכן תלויות של מודולים ומחלקות, בעוד בפייטון היו נדרשים שינויים בקוד עצמו = הרבה יותר עבודה.
המודעות לסיכונים, כנראה גדולה - הסיפור של פייטון 3 הדהד בכל התעשייה במשך שנים ככישלון צורב.
האם המעבר לג'אווה יהיה מהיר יחסית, או שיגרר לאורך שנים?
נחכה ונראה.
יש, אגב, אנשים שנבהלים ומבהילים מהסיטואציה, במיוחד לאור הפסקת התמיכה בג'אווה 8 המתוכנן לינואר 2019.
אני אישית לא מודאג כל-כך מעניין התמיכה. אם אני הייתי אורקל, הייתי רוצה להלחיץ קצת את התעשייה להתחיל ולבצע את המעבר, אך ברגע האמת - הייתי ממשיך לספק עדכונים קריטיים גם מעבר. אם אורקל לא יעשו זאת - פתרונות אחרים יימצאו. ככל שהקהילה עשירה יותר - סביר יותר שימצאו עוד איזונים ובלמים שיגנו עליה מפני התדרדרות.
קישורים: מדריך לעדכון פרויקט מייבן לג'אווה 11.
שיהיה בהצלחה!
----
[1] החישוב הוא באמת יותר מורכב, ופחות קל להבנה. לארכיטקטורות שונות של חומרה, יש הגדרה שונה למהו "Processor". רישיונות הוא בד"כ נושא סבוך בחברות Enterprise - אז אל תניחו שהסיבוכיות הזו היא "תרגיל" של אורקל.
ג'אווה בהחלט הייתה טכנולוגיה חדשנית ומרגשת - אך זה היה לפני כ 20 שנה.
מאז גרסאות של ג'אווה שוחררו בקצב של אחת לכמה שנים, עם חידושים מעטים - יחסית לשפות אחרות: #C המקבילה, רובי, Go, ג'אווהסקריפט כמובן (שלא בטוח שקצב השינויים היה רק לטובה), סקאלה, קוטלין, Clojure, ועוד.
כבר לפני כמה שנים שמעתי על השוואה בין ג'אווה לקובול - שפה שחלשה על חלקים גדולים מהתעשייה, אך עם הזמן הפכה למיושנת להחריד.
החברה שפיתחה את ג'אווה במקור (Sun Microsystems) כשלה עסקית ונרכשה ע"י Oracle בשנת 2010 - שקיבלה את הנכס הנדיר שנקרא ג'אווה, אך נכס שגם דורש השקעה רבה ומחולק בחינם בעולם.
הגרסה המשמעותית האחרונה של ג'אווה הייתה גרסה 8, ששוחררה ב 2014 - ואכן הציגה כמה חידושים יפים.
הגרסה המשמעותית הבאה של ג'אווה, גרסה 11 - עומדת להיות משוחררת בימים אלו והיא מייצרת סוג של "רעידת אדמה קטנה" בסביבה שיציבות והמשכיות - היו על לאחרונה עקרונות ברזל שלה.
כשאנו מדברים על שינוים אנחנו לא מדברים רק על שינוים בשפת ג'אווה עצמה - אלא בעיקר על שינויים בפלטפורמת ה JVM, פלטפורמה שמשרתת את Scala, Closure, קוטלין, Groovy, JRuby, ועוד. חשוב לזכור שה JVM הוא גדול יותר מג'אווה.
ג'אווה גרסה 9 היא נקודת ציון בהיסטורית הגרסאות של ג'אווה - למרות שהיא עצמה חסרת חשיבות לחלוטין. ג'אווה 9 החלה כמה שינויים גדולים המגיעים לידי מימוש בגרסה 11 שיוצאת עכשיו (ספטמבר 2018):
- Module System - מודולריזציה בתוך ה JDK, ולראשונה הסרה של קוד ישן (בכמויות לא-מבוטלות). המהלך מציע כמה יתרונות טכניים חשובים - אך משמעותו שלראשונה ה JDK הופך ל non-backward-compatible, מה שעשוי לפגוע לאורך שנים בקצב האימוץ של הגרסאות החדשות. הסרת קוד ישן מה JDK מתוכננת להמשיך בגרסאות עתידיות של ג'אווה גם כן.
- New release cycle - הכולל releases "קטנים" כל חצי שנה, וגרסאות LTS.
- גביית דמי-שימוש עבור עדכוני באגים ועדכוני-אבטחה - אורקל עושה מהלך משמעותי על מנת לסבסד את תחזוקת ג'אווה ע"י משתמשיה, ואולי אף יוביל לרווחים משמעותיים לאורקל עצמה.
- יישור קו בין OracleJDK ל OpenJDK - צעד משנה למהלך הנ"ל.
גרסה 9 הציגה לראשונה התחלה של כל השינויים הנ"ל, אך הוכרז מראש שזו גרסה שתתמך לחצי-שנה בלבד, וגרסת היעד לתמיכה ארוכה (LTS, כלומר Long-term support) תהיה גרסה 11.
מאז יצאה גם ג'אווה 10 - גם היא גרסה מינורית ולא כ"כ נוספת, שסיפקה עוד כמה התקדמויות בנושאים הנ"ל (ומספר תוספות קטנות לשפה) - אבל חשיבות הגרסה הייתה בהיותה הכנה גנרלית לשחרור גרסה 11.
גרסה 11 היא זו שתעמת את קהילת ה JVM בפעם הראשונה באמת עם מציאות חדשה, והדילמות שנובעות ממנה. זו גרסת LTS שתתמך עכשיו עד 8 שנים קדימה, גרסת ג'אווה המשמעותית שתהיה זמינה בשנים הקרובות.
- האם קהילת הג'אווה שהייתה רגילה לג'אווה חינמית תתחיל לשלם ל Oracle עבור עדכונים ותמיכה?
- האם החלק הארי של הקהילה יישאר על גרסה 8, או שנראה אימוץ משמעותי גם של גרסאות 11 והלאה, כבר בשנים הקרובות?
בואו נתחיל לסגור פינות...
אם התיאור הנ"ל משאיר אתכם עם סימני שאלה - זה מובן לחלוטין. אנסה להתחיל ולענות על השאלות העיקריות שצצות מהשינויים הללו.
מה ההבדל בעצם בין OpenJDK ו OracleJDK? ומה השתנה?
החל מגרסה 7 החלה להיות משוחררת ההפצה של OpenJDK, שהיא הפצה תחת רישיון GNU GPL v2 עם החרגה ל linking - רישיון Open Source חופשי, המאפשר שימוש בג'אווה בכדי לכתוב תוכנה מסחרית ולמכור אותה.
היוזמה הייתה עוד של חברת Sun, והגנה על האופי הפתוח של ג'אווה.
אורקל מציעה גם "הפצה משופרת" של ג'אווה ברישיון מסחרי בשם OracleJDK הכוללת עוד כמה ספריות (בעיקר מסביב לטכנולוגיית JavaFX, שלא תפסה) ו tooling שהגיע עם ההפצה כמו כלי ניטור ובדיקות ביצועים. הכוונה הייתה כנראה כן להפיק הכנסות מג'אווה - אך ההצלחה לא הייתה גדולה.
החל מגרסה 9, הפצות ה OpenJDK וה OracleJDK מתאחדות. זה לא יקרה ע"י הסרה של תוכן מתוך ה OracleJDK אלא בעיקר ע"י פתיחה של התוספות שאורקל סיפקה להיות OpenSource. כמה תכונות עם רישיון מסחרי (כמו ה Java Web Start) אכן יוסרו מה JDK, אבל בעיקר בגלל שהאימוץ שלהן נמוך למדי. התהליך מסתיים עכשיו בשחרור גרסה 11, בו תוכן ההפצות הוא זהה - וההבדל ביניהן הוא רק הרישיון.
למה לי לשלם לאורקל כסף על מה שזמין בחינם וזוכה לתמיכה של הקהילה (כלומר: OpenJDK)?
שאלה מצוינת! ביחד עם ההחלטה ליישר בין ההפצות, יש החלטה יותר משמעותית לצמצם את התמיכה שאורקל סיפקה ל OpenJDK בחינם. כלומר: קיבלנו (אנחנו הקהילה) עוד כמה ספריות וכלים (כגון Flight Recorder ו Mission Control - כלי בעל יכולות לניטור ביצועים על מערכת חיה לאורך), אבל אנחנו מפסיקים לקבל מאורקל תיקוני באגים ותיקוני אבטחה זמן ארוך לאחר שגרסת הג'אווה שוחררה. מעתה - התיקונים שאורקל תספק ל OpenJDK בחינם יהיו רק לפרקי זמן קצרים לאחר שחרור הגרסה.
אם הדבר היה נתון לבחירת המשתמשים - נראה שכמעט כל המשתמשים היו מעדיפים את המצב הקודם. במהלך הזה אורקל "דוחפת" את המשתמשים לרכוש ממנה (או מספקי צד-שלישי) תמיכה בתשלום לג'אווה.
להגנתה של אורקל יאמר שהיא כנראה משקיעה בג'אווה הרבה יותר ממה שהיא מרוויחה ממנה, וזה סה"כ לגיטימי להפסיק להיות פילנטרופ.
כיצד אורקל עומדת לצמצם את התמיכה שמסופקת ב OpenJDK וכיצד זה קשור למחזור שחרור הגרסאות החדש?
ג'אווה 9 הציגה מחזור חדש של שחרור גרסאות שנראה כך:
לגרסה 8 של ג'אווה, אורקל סיפקה תיקוני-באגים ותיקוני אבטחה בחינם למשך כחמש שנים. התמיכה מסתיימת, חשוב לציין, בינואר 2019. בקרוב מאוד.
החל מגרסה 9, אורקל מתחייבת שחרר גרסה פעמיים בשנה, מה שיאפשר לשחרר תוספות לשפה וה JVM בתדירות גבוהה יותר.
הבחירה במספרים שלמים עבור הגרסאות הללו לא מצביע על כמות התוכן שיתווסף, אלא על אופנה של השנים האחרונות ״לרוץ״ עם מספרי גרסאות (למשל: ראקט הייתה בגרסה 0.14 לפני שלוש שנים - אך כיום היא כבר בגרסה 16.5. אנגולר הייתה בגרסה 2.0 ב 2014, אך עוד מעט משתחררת גרסה 7.0).
מכיוון שה JVM הוא תשתית קריטית למערכת שרצה עליו, סביר שרוב הארגונים לא יסכימו לעדכן גרסאות מיד לכשיצאו (אלא אם יוכח שהגרסאות החדשות שמשתחררות הן יציבות בצורה מופלאה - מה שיהווה הפתעה), ולכן יהיו גם גרסאות LTS שימשיכו לקבל עדכונים ותיקונים לטווח ארוך יותר, גם כאשר יש גרסה חדשה יותר זמינה.
רוצים תזכורת מה יכול להשתבש בגרסה חדשה של JDK? הנה דוגמה לבאג שהוצג בגרסה 9 של ה JDK:
תיקוני באגים ותיקוני אבטחה ישוחררו רק על הגרסה האחרונה (בחינם), או על גרסאות LTS (בתשלום). אם חשוב לנו לקבל עדכונים שוטפים יש לנו שלוש ברירות:
- לעדכן את גרסת ה JVM/ג'אווה שלנו כל 6 חודשים כמו שעון. כל יום שאנו לא על הגרסה האחרונה הוא יום שבוא יכול להשתחרר עדכון אבטחה קריטי שלא נקבל.
- להשתמש ב OracleJDK בתשלום ולעבוד על גרסאות LTS על מנת לקבל עדכוני אבטחה שוטפים. התשלום הוא כ $2.5 דולר לחודש ל Desktop/Laptop ו $25 לחודש לכל Core פיסי של שרת [1].
- לקנות תמיכה מספק צד-שלישי, כגון Azul או RedHat כאשר הם אלו שיספקו תיקונים לבאגים ובעיות אבטחה. כל חברה - עם המדיניות שלה.
- למשל, ל Azul יש תוכנית בשם Medium Term Support (בקיצור MTS), שבה היא תתמוך לאורך שנתיים וחצי בכל גרסה שניה של ג'אווה שאיננה LTS. יתרון גדול בגישה הזו היא חפיפה בתמיכה בין גרסאות ה MTS - מה שלא קיים בתמיכה ה"חינמית" של אורקל .
- חשוב לספקי צד-שלישי יספקו גם תמיכה לג'אווה גרסה 8 לעוד כמה שנים - היכן שבכל מקרה רוב התעשייה צפויה להיות בזמן הזה. הנה למשל הצהרה של יבמ.
עוד פרט שכדאי לציין הוא שהרישיון של OracleJDK (לפחות לגרסה 11) מאפשר שימוש ללא הגבלה לצורך פיתוח. התשלום הוא רק עבור שימוש production (שאותו ישלם לקוח המריץ את הקוד On-Premises, או ספק SaaS - עבור המכונות שהוא מריץ).
האם ההצהרה על שחרור גרסת ג'אווה כל 6 חודשים היא לא מטעה? בעצם נראה שגרסאות ה LTS הן אלו שמשנות - והן ימשיכו בקצב אטי יחסית של כל 3 שנים?
באמת היא כנראה איפשהו באמצע. אורקל מצהירה שכל גרסה שתשוחרר תעבור Quality cycle מפרך כמו של גרסה מ'אגורית עד היום. כמו כן יש הצהרה שהיא תשחרר לפחות שני עדכונים (תיקוני באגים ואבטחה) מינוריים - לכל גרסה שתצא. גרסאות שאינן LTS הן לא גרסאות "בטא" - ע"פ ההצהרה.
סביר להניח ששחרור גרסאות תכוף יאפשר לג'אווה להתפתח מהר יותר - אך במידה. מי שצפוי לעבוד באמת עם גרסאות שאינן LTS הוא רק פלח צר של Early adopters (למשל: סטארטאפ בתחילת דרכו), במיוחד בשנים הראשונות.
האם מה שאורקל עושה הוא "בסדר"? האם זה לא "מחטף מרושע"?
אין לי תשובה ברורה. בד"כ כשארגון רוצה לקבל הכנסות מפרויקט Open Source - הוא מציע ערך נוסף על הקיים בכדי לקבל עליו תשלום: Premium support או יכולות נוספות (למשל: Redis modules).
אורקל בעצם ממשיכה לגבות תשלום על תמיכה, תוך כדי שהיא מפסיקה בפועל את התמיכה-בחינם שהיא סיפקה לאורך שנים רבות. אם היה מדובר בפרויקט קטן - זה אולי לא היה מתקבל בשמחה, אך זה לא היה עושה הרבה רעש. ג'אווה היא אחת מהתשתיות (ביחד עם לינוקס, MySQL ועוד כמה) המשמעותיות ביותר המסופקות בחינם. ההשפעה - היא משמעותית!
נקודת סולידריות מסוימת היא כן ההשקעה הגדולה שאורקל סיפקה לאורך שנים - ובחינם.
מנקודת מבט מסוימת, אורקל מפנה מקום לקהילה / חברות צד-שלישי לקחת על עצמן את האחריות במתן תמיכה לג'אווה בחינם. יבמ, גוגל, וסאפ הן 3 חברות גדולות, עם עניין עמוק בג'אווה שיכלו לעשות זאת - אך אף אחת לא התנדבה.
אורקל כמובן לא מוותרת על ג'אווה - ומשאירה את "גרעין השליטה" על הטכנולוגיה - אצלה. אפשר לומר שמתקבל על הדעת להניח שהמהלך של אורקל בא לצמצם עלויות שאורקל לא חפצה בהן, וזו לא "תוכנית זדונית לסחוט מהעולם כמה כסף שאפשר". לא נראה שאורקל ניסתה לחסום ספקי צד-שלישי לתת תמיכה בתשלום לג'אווה, וכך בעצם להתחרות ב OracleJDK offering שלה.
כאב ראש לאנשים רבים בעולם - ככל הנראה ייגרם בכל זאת.
![]() |
"איך אתה מתכנן להגיב לשינוי בתהליך שחרור הגרסאות של ג'אווה" מתוך סקר של ה JVM Ecosystem |
דיברנו על איזו בעיה של תאימות לאחור, במה בדיוק מדובר?
ג'אווה 9 הציגה לראשונה את ה Module System (הידוע לשעבר כ Project Jigsaw או super packages) - כלי מודולריזציה בשפה.
packages, כלי ארגון הקוד עד עכשיו, הוא כלי נחמד - אבל עם מגבלה עיקרית: הוא עוזר לארגן את תוך ה package (למשל: ניתן להגדיר מחלקות כ private ל package) אך הוא לא מתמודד עם ניהול תלויות בין packages.
- אין לי יכולת אמיתית לחשוף מחלקות מסוימות בצורה סלקטיבית ל packages אחרים - הרזולוציה היא רק private או public.
- אין ניהול רציני של התלויות בין ה packages.
- כל מחלקה יכולה להוסיף כל תלות שהיא רוצה ל package אחר. כלומר: התלויות בין ה packages מגודרות שוב ושוב, ומפוזרות בין ה classes השונים של המחלקה - שזה לא DRY, וקשה מאוד לבקרה.
- כל מחלקה יכולה להוסיף את עצמה לכל package - כך שאין שליטה ממה מורכב בדיוק ה package. זו בעיה משנית.
ה Module System (בקיצור: MDS) של ג'אווה מאפשר להגדיר קובץ בשם module-info.java המגדיר מודול ואת התלויות שלו. הנה דוגמה לכזו הגדרה:
module monitor.rest {
requires spark.core;
requires monitor.statistics;
exports monitor.rest;
}
הקומפיילר יתייחס להגדרות ויאכוף אותן (יופי!).
חשוב לציין שמילים שמורות חדשות, כמו module ו requires הן בעלות משמעות רק בקובץ ה module-info, ולא ישפיעו על שאר קוד הג'אווה.
קישורים: Java 9 modules cheat sheet, מדריך, ועוד כמה מקורות טובים
ג'אווה השתמשה ב MDS בעצמה עבור ה JDK. במידה מסוימת זה היה סוג של "eat your own dog food", אבל מצד שני - זה היה צורך מרכזי של ה JDK עצמו, שעם השנים התלויות הרבות והמיותרות בו הפכו אותו לקשה מאוד לתחזוקה. באורקל טוענים שזו אחת הסיבות לשחרור הכל-כך איטי של שינויים בג'אווה.
חשוב לציין שמילים שמורות חדשות, כמו module ו requires הן בעלות משמעות רק בקובץ ה module-info, ולא ישפיעו על שאר קוד הג'אווה.
קישורים: Java 9 modules cheat sheet, מדריך, ועוד כמה מקורות טובים
ג'אווה השתמשה ב MDS בעצמה עבור ה JDK. במידה מסוימת זה היה סוג של "eat your own dog food", אבל מצד שני - זה היה צורך מרכזי של ה JDK עצמו, שעם השנים התלויות הרבות והמיותרות בו הפכו אותו לקשה מאוד לתחזוקה. באורקל טוענים שזו אחת הסיבות לשחרור הכל-כך איטי של שינויים בג'אווה.
במעבר מ Java 8 ל Java 11, אורקל חילקה את ה JDK לכ 80 מודולים שונים, חלקים יצאו מה JDK ויהיו זמינים כספרייה נפרדת, או שנפרד מהם לגמרי. הנה רשימת היכולות שהוסרו מה JDK:
- corba - לזקנים ביננו, שזכו להכיר את המפלצת.
- java.transaction (מדובר בטרנזקציות אפליקטיביות, לא של JDBC. כאלו כמו שהיו ב EJB גרסה 1).
- java.xml.ws וספריות נוספות של טיפול ב XML (למשל JAXB). בתחילת שנות ה 2000 התייחסו ל XML כ "פורמט שהולך לתאר את כל המידע בעולם". תזכרו את זה כשאתם מתחילים להתלהב מטכנולוגיה חדשה.
- JavaFX - טכנולוגיית Desktop UI של ג'אווה שלא ממש הצליחה. לג'אווה יש היסטוריה מרשימה ביותר של טכנולוגיות UI כושלות (אפשר לדבר בהזדמנות גם למה...)
- JavaFX תמשיך להיות זמינה כמודול עצמאי שלא קשור ל JDK.
- Applets
- Java WebStart (טכנולוגיה להתקנה ועדכון אוטומטי של אפליקציות ג'אווה)
- Nashorn שהחליף את Rhino כמפרשן JavaScript שרץ על גבי ג'אווה ומסופק כחלק מה JDK.
- נשהורן הוא חדש, אך שפת ג'אווהסקריפט מתפתחת בקצב כ"כ מהיר, שהייתה מספיקה גרסה אחת בכדי להבין שלא ישים לתחזק עוד מפרשן JavaScript כחלק מה JDK.
אם אתם משתמשים באחת מהטכנולוגיות או ה APIs שהוסרו מה JDK - יהיה עליכם ליבא אותן בצורה מפורשת (למשל: באמצעות מייבן) או למצוא חלופה (למשל ל Applets או Nashron - שלא ייתמכו יותר).
המודולריזציה של ה JDK תסייע גם להלחם בצריכת הזיכרון הגבוהה של ג'אווה, ובגודל ה distributables. ג'אווה עובדת עם Dynamic linking (קישור של קוד בזמן ריצה, ולא בזמן קומפילציה). יש בכך כמה יתרונות (קל מאוד לייצר Plugin architecture, ניתן לבצע אופטימזציות מסוימות) אבל המחיר הוא קבצי jars גדולים מהנדרש (אנו כוללים את כל הקוד בספריה, אפילו אם אנו זקוקים רק ל 5% ממנה) וגם צריכת זיכרון גבוהה יותר.
בעולם ה micro-services וה FaaS (למשל: AWS lambda) - התכונות הללו הן מגבלה רצינית של ג'אווה. למבדה קטנה בג'אווה יכולה בקלות לדרוש jar file של עשרות MB ולצרוך מאות MBs של זיכרון. למבדה דומה ב ++C או Go תדרוש שבריר מהמשאבים של ג'אווה. כנ"ל לגבי ג'אווהסקריפט או פייטון - אבל מסיבות קצת שונות.
ג'אווה 9 הוסיפה כלי בשם jlink המאפשר לבנות אפליקציית ג'אווה עם static linking. השימוש העיקרי הוא FaaS או הפצה של ג'אווה למכשירים עם מגבלות במשאבים. החיסרון של jlink הוא שהתוצר לא ניתן לעדכון ללא החלפה מלאה של התוצר הבינרי. היום ניתן לעדכן גרסאת JRE ולקבל עדכוני אבטחה / באגים קריטיים מבלי לעדכן את קוד האפליקציה. אפליקציה שנבנתה עם jlink תדרוש בנייה מחדש ו deploy מחדש - על מנת להחיל את אותם העדכונים.
הסכנה שבשינוי
מעבר בין גרסאות ג'אווה בדרך-כלל לא היה עניין גדול, אולי צריך להחליף בקוד משתנים ופונקציות השתמשו בשם שם מילה שמורה חדשה.
המעבר בין ג'אווה 8 לג'אווה 11, או בין JDK 8 ל JDK 11 (למי שמשתמש בשפת JVM שאיננה ג'אווה) - עומד להיות עניין גדול יותר.
רבים מהכלים וספריות של ג'אווה דרשו עדכון על מנת לתמוך ב MDS. סביר להניח שעל מנת להשתמש בג'אווה 11 בעצמכם, יהיה עליכם לעדכן גרסאות של ספריות לגרסאות שעשו כבר את המעבר.
כפי שאתם יודעים, עדכון גרסה של ספריה הוא לפעמים שינוי של שורה בכלי ניהול התלויות (גריידל או מייבן, למשל), אבל לעתים נדרשים שינויים גדולים בקוד - שיכולים להיות מורכבים. כל השינויים הללו שדחינו כבר חודשים רבים...
הסכנה שבחובה לעדכן, אפילו אם זה שינוי קטן, הוא שספריה שאתם תלויים בה - איננה מעודכנת. לבחור שמתחזק אותה לא הייתה חצי שעה לסגור את הסיפור קצה לקצה.
הבעיה הזו היא טרנזיטיבית, כך שאם אתם משתמשים בספריה שמשתמשת בספריה, שמשתמשת בספריה אחרת שלא עודכנה - יכול להיות שנתקעתם.
בואו ניזכר שנייה מה קרה בפייטון:
ראשי הקהילה תיארו זאת כך:
"באותה תקופה שעבדנו על פייטון 3 - השימוש בפייטון בעולם צמח בקצב מהיר מאוד. הנחנו שבשל המגמה, יהיה יותר קוד בפייטון 3 מאשר בפייטון 2 תוך מספר שנים - ולכן החלטנו "לספוג את הכאב" שבמעבר לא-תואם לאחור בכוונה לייצר עתיד טוב יותר לקהילת הפייטון. היום ברור שיעבור עוד עשור או יותר - עד שיהיה יותר קוד פייטון 3 מאשר קוד פייטון 2".
התוכנית לא כ"כ הצליחה: בסיסי קוד שברמת תחזוקה / שליטה בקוד גבוהה - היה ניתן להמיר במאמץ לא גדול - אבל המפתחים לא המירו את הקוד - כי ספריות רבות שהשתמשו בהן עדיין לא עברו לפייטון 3.
מתחזקי ספריות ותיקות כבר הפחיתו את ההשקעה בספריה - ולא היו מוכנים לעשות את המעבר. גם להם היו לפעמים ספריות אחרות שהם תלויים בהן - שלא ביצעו מעבר לפייטון 3. ה Distros העיקריים של לינוקס המשיכו להיות מסופקים עם פייטון 2 - וחוזר חלילה.
וכך - כל העגלה נתקעה. קריאה לקהילה לבצע את המעבר לא נענתה בחיוב, או לפחות לא בקצב מהיר. הוקמו אתרים כמו http://py3readiness.org ו http://python3wos.appspot.com שמדדו ועודדו - את האימוץ של פייטון 3.
פייטון 3 שוחררה ב 2008, אבל לקח בערך עשור עד שרוב הקהילה הצליחה לעשות את המעבר.
-----------------
השינויים הנדרשים במעבר מג'אווה 8 לג'אווה 11 - הם קטנים יותר משמעותית מאלו שהיו בפייטון 3. בעיקר צריך לעדכן תלויות של מודולים ומחלקות, בעוד בפייטון היו נדרשים שינויים בקוד עצמו = הרבה יותר עבודה.
המודעות לסיכונים, כנראה גדולה - הסיפור של פייטון 3 הדהד בכל התעשייה במשך שנים ככישלון צורב.
האם המעבר לג'אווה יהיה מהיר יחסית, או שיגרר לאורך שנים?
נחכה ונראה.
יש, אגב, אנשים שנבהלים ומבהילים מהסיטואציה, במיוחד לאור הפסקת התמיכה בג'אווה 8 המתוכנן לינואר 2019.
אני אישית לא מודאג כל-כך מעניין התמיכה. אם אני הייתי אורקל, הייתי רוצה להלחיץ קצת את התעשייה להתחיל ולבצע את המעבר, אך ברגע האמת - הייתי ממשיך לספק עדכונים קריטיים גם מעבר. אם אורקל לא יעשו זאת - פתרונות אחרים יימצאו. ככל שהקהילה עשירה יותר - סביר יותר שימצאו עוד איזונים ובלמים שיגנו עליה מפני התדרדרות.
קישורים: מדריך לעדכון פרויקט מייבן לג'אווה 11.
שיהיה בהצלחה!
----
[1] החישוב הוא באמת יותר מורכב, ופחות קל להבנה. לארכיטקטורות שונות של חומרה, יש הגדרה שונה למהו "Processor". רישיונות הוא בד"כ נושא סבוך בחברות Enterprise - אז אל תניחו שהסיבוכיות הזו היא "תרגיל" של אורקל.