יצירת EXE ב-Java

[13 באוקטובר 2008] [23 תגובות]

אחת השאלות הנפוצות ששואלים מתכנתים מתחילים (וגם הרבה מתקדמים) בשפת Java היא:

"כיצד אני יוצר קובץ EXE שניתן להריץ אותו?"

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

נחזור אל הנושא ואל התשובות לשאלה. ישנן מספר תשובות אפשריות לשאלה הזו וכולן נכונות:

אי אפשר ליצור EXE ב-Java

כדי להבין למה התשובה הזו נכונה, נבחן את ההבדל שבין המהדרים (קומפיילרים) של השפות C ושל Java.

המהדר של C לוקח קוד בשפת C והופך אותו לקובץ EXE. הסיומת EXE היא קיצור של המילה Executable (תרגום: ניתן להרצה, ניתן לביצוע). ברגע שנפעיל את קובץ ה-EXE - התוכנית שלנו תרוץ. אם לחבר שלכם יש מערכת Windows גם כן, תוכלו לתת לו את קובץ ה-EXE והתוכנית תפעל גם אצלו ללא כל בעיה.

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

מההשוואה הזו, קבצי EXE נשמעים הרבה יותר טובים, נכון? אז זהו - שלא.

קובץ EXE נוגד את כל מה שעומד מאחורי Java

אז נגיד והכנתם תוכנה נפלאה בשפת C, והידרתם אותה לקובץ EXE וחבר שלכם (שמשתמש ב-Windows) קיבל את הקובץ, משתמש בתוכנה ונהנה. חבר נוסף שלכם קנה מחשב Macintosh וחבר נוסף התקין את מערכת ההפעלה Linux והחבר השלישי קנה מכשיר iPhone. כולם ממש רוצים להשתמש בתוכנה שלכם. הם לא יכולים - EXE הוא קובץ הפעלה רק של Windows הוא לא יפעל באף אחד מהמחשבים של החברים שלכם.

לעומת זאת, נניח שכתבתם את התוכנה ב-Java וחילקתם אותה לכל החברים שלכם (מר Windows, אדון מקינטוש, גברת לינקוס והנער iPhone) - כולם מתלוננים שהם לא יכולים להריץ את התוכנה - הרי מה זה בכלל קובץ class... אתם מפנים אותם לאתר של Java כדי שיורידו בחינם את ה-JVM (נקרא גם JRE - Java Runtime Environment). הם עושים זאת וכעת כולם משתמשים בתוכנה שלכם.

המשפט שעומד מאחורי Java הוא "תכנת פעם אחת, הרץ בכל מקום". התוכנית של C יכלה לרוץ רק על Windows ואילו זאת של Java בכל מחשב או מכשיר. אז גם אם הייתם יכולים להכין קובץ EXE ב-Java עדיין הייתם רוצים לעשות זאת? אם התשובה היא כן, תמשיכו לקרוא.

בטח שאפשר להכין קובץ EXE

ישנם מהדרים מיוחדים המאפשרים לכם לקחת את קוד המקור של התוכנית שלכם (ב-Java) וליצור מהם EXE. התוכנית תרוץ רק במערכת ההפעלה Windows, אבל יהיה לכם קובץ EXE כמו כל תוכנה רגילה - ללא צורך בהתקנת JVM.

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

  • לא השתמשתי מעולם באף אחד מהם, ולכן אני לא יכול להמליץ
  • קובץ EXE נוגד את כל מה שעומד מאחורי Java

אל תוותרו, יש פתרון אחר.

הפתרון שיספיק לחצי מהמתכנתים (ועוד בחינם)

אנחנו נבנה "מריץ Java" - הרעיון הוא פשוט. על מנת להריץ תוכנית Java (לדוגמה הקובץ hello.class) יש לכתוב את הפקודה הבאה java hello בתיבת הטרמינל השחורה (ה-Command Line). אם הקובץ hello.class מכיל פונקציה בשם main - היא תרוץ.

אנחנו ניצור קובץ EXE (תוכנית בשפת C) שכל מה שהוא עושה הוא להריץ את הפקודה java hello.

מה אנחנו מרוויחים:

  1. אנחנו עדיין שומרים על קבצי ה-class שלנו והתוכנה תרוץ על כל מחשב.
  2. לתוכנית יהיה קובץ EXE וכך אנשים לא יסתבכו בשאלה כיצד להריץ אותה.
  3. זה יראה יותר "מקצועי" (לפחות לחלק מהאנשים).

הנה הקוד (בשפת C) של התוכנית:

int main(){
        system("java hello");
        return 0;
}

תוכלו להדר את התוכנית הזו לקובץ EXE, ולהריץ אותה. היא תריץ את התוכנית hello שנכתבה בשפת Java. כמובן שאם התוכנית שלכם שמורה בקובץ שונה מ-hello.class, למשל myprog.class עליכם לשנות את השם hello בתוכנית ל-myprog.

כעת תוכלו להוסיף את קובץ ה-EXE לסיפרייה של התוכנה שלכם (איפה ש-hello.class נמצא) ולהגיד לאנשים להריץ את קובץ ה-EXE (זה יפעל רק לבעלי Windows).

לא מדברים שפת C? קחו את ה-EXE מכאן

הורידו את הקובץ launch.zip

מה יש בקובץ ה-zip:

  1. hello.class - תוכנית שנכתבה בשפת Java. יודעת להדפיס את השורה Hello World למסך.
  2. hello.exe - קובץ ה-EXE, כמו שתמיד רציתם.

פתחו את קובץ ה-ZIP לסיפרייה אחת והפעילו את קובץ ה-EXE. הקובץ רץ ומזהה את השם של עצמו(hello.exe) ומפעיל את קובץ ה-class בעל השם הזהה(hello.class).

אם שם התוכנית שלכם היא cool_game.class, יש לשנות את שם ה-EXE ל-cool_game.exe והכל יעבוד כפי שרצינו.

מה צריך לדעת?

  1. התוכנית לא תפעל במחשבים ללא ה-JVM מותקן.
  2. התוכנית (cool_game.class או hello.class) חייבת להכיל את הפונקציה הראשית main.

לסיכום

ה-EXE שיצרנו לא הכיל את קוד התוכנית, אלא פשוט שימש כדרך פשוטה להפעיל את תוכנית ה-Java. אני ממליץ להדר (לקמפל) בעצמכם את תוכנית ה-C ולכתוב את שם התוכנית שלכם ישירות לקוד - כך תמנעו מבעיות שעלולות להופיע.

תהנו.

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

23 תגובות

  1. איתי | 10/13/2008 12:21:22 PM

    הקטע עם הקובץ EXE בסוף נשמע לי ממש מוזר, הוא דורש JVM פחות או יותר, ומאלא מפנה לקובץ ה-CLASS, אז למה לא להוריד את ה-JVM ולפנות לקובץ ה-CLASS בעצמו?

    בכל מקרה נהנתי לקרוא, ולמרות שאני לא יודע JAVA מצאתי את הנשוא מעניין (כן, אני שואל את עצמי למה, אבל לא יכולתי להפסיק).

  2. טל | 10/13/2008 2:32:22 PM

    אחת הבעיות כשנותנים למישהו תוכנה שנכתבה ב-Java היא שלא כולם יודעים איך להריץ אותה. קובץ EXE מוכר לכולם וכך צריך פחות הסברים.

    כמו שאמרת, זה לא מונע את הצורך ב-JVM, אך מונע את הצורך לפתוח CMDולהריץ את הפקודה בעצמך.

  3. אלי | 11/10/2008 9:49:31 AM

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

    ואגב הקופלציה גורמת לקובץ להיות כקובץ שניתן להריץ אותו בלי להיכנס לאקליפס נכון ? פשוט דאבל קליק !?

  4. טל | 11/10/2008 1:32:44 PM

    קבצי Java מהודרים ל-"שפת ביניים" ומתורגמים בזמן הריצה לפקודות מכונה שהמחשב יכול להריץ. הקובץ המהודר של Java הינו עם הסיומת class.

    תוכל להריץ את הקובץ במספר דרכים. דרך אחת היא דרך ה-Command Line פשוט לרשום את הפקודה java hello.class למשל... דרך שנייה היא יצירת Executable Jar ב-Java - וזה יעבוד עם דאבל קליק.

  5. אלי | 11/11/2008 8:43:11 AM
    תודה על התשובה טל, אבל לא ממש הבנתי ב- JAVA יש אפשרות לעשות EXPORT ואז נוצר קובץ JAR .. אתה יכול להסביר לי איך אני יוצר את הקובץ המקומפל .class ? תודה רבה
  6. טל | 11/16/2008 12:38:42 PM

    יצירת הקובץ המקומפל ("מהודר" בעברית) נעשה על ידי קימפול ("הידור") התוכנית שאתה כותב.

    תוכל לעשות זאת דרך סביבת העבודה שבה אתה מתכנת (כמו Eclipse) או על ידי הרצת הקומפיילר ("מהדר") על הקוד לפי הפקודה:

    javac code.java

    התוצר יהיה: code.class אותו ניתן להריץ (במידה ויש בו פונקציית Main). אם תרצה לדעת עוד, אני מציע לגשת למדור לימוד ה-Java באתר.

  7. יעל | 5/8/2009 7:09:03 AM

    שלום ידוע לך על תוכנה שממירה בין שפות תכנות שונות ואיזה שפות היא ממירה?????

     

  8. טל | 5/10/2009 9:03:12 AM

    אני לא מכיר תוכנות כאלו. אני מאמין שתוכנות כאלו לא יכולות להיות מושלמות ואולי רק לעזור להמיר בין שפות.

    להמיר בין שפת C# ל-Java ולהיפף זה הגיוני... אבל להפוך Visual Basic 6 ל-C plus plus זה לא יהיה רעיון טוב.

  9. יונתן | 10/28/2009 12:22:33 AM

    מה קורה טל. קראתי מה שרשמת ועדיין אני לא ממש הבנתי איך.
    אני הכנתי משהו בjava ואני מעוניין לשלוח את זה לאחי ולא איןeclipse ולא תוכנה שמריצה java מה אני צריך לעשות? ואיפה הcommand line השחור?

    סלח לי על הצעירות רק התחלתי:)

  10. אלדר | 11/27/2009 5:49:30 AM

    סליחה לא הבנתי

     איפה לכתוב את הקוד  ש C איך שומרים וכל זה לא הצלחתי

  11. טל | 11/28/2009 11:44:52 AM

    @יונתן, כפי שכתוב בפוסט, המחשב שמריץ את זה חייב שה-JRE יהיה מותקן עליו. לא צריך Eclipse ולא את ה-JDK.

    ה-EXE רק מתחיל את התהליך, הוא לא יודעממש להריץ את ה-Java.

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

  12. אלדר | 11/28/2009 9:37:31 PM

    שתי דברים אחי:

    1.הקובץ EXE שהבאת לא פועל לי הוא אומר שחסר איזה קובץ

    2.אני לא רוצה את הקובץ EXE הזה יש לי עבודה ואני רוצה הפוך אותה ל EXE איך אני עושה את זה? 

     

  13. אלדר | 11/29/2009 8:20:22 PM

    אחי הקובץ שנתת לא פועל הוא כותב :"הפעלת היישום נכשלה מכיוון שלא אומר cygwin.dll

     

    מה צריך לעשות אחי כבר בניתי 2 עבודות ואני לא יכול לתת לאף אחד הריץ אותן 

  14. אפי | 12/8/2009 12:56:44 PM

    טל !

    לא מבין ת'ראש שלך אם גם אחרי יצירת EXE צריך את ה-JRE אז ממש לא הרווחנו כלום.

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

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

  15. עדי | 2/7/2010 7:56:37 AM
    איך אני הופך את קובץ הCLASS לJAVA?
  16. שאולי | 6/26/2011 8:57:03 AM

    אם רוצים לקבץ את התוכנית לקובץ jar ורוצים שהקובץ ייפתח בלחיצה כפולה צריך להוסיף בשורה של ה public class

    implements Runnable  

    כך שיראה ככה:

     public class Something implements Runnable

    public run(){}

    מקווה שעזרתי...

  17. שלמה | 6/28/2011 2:46:04 AM

    יש דרך הרבה יותר פשוטה  להריץ תכניות Java בקלות ע"י קובץ אצווה בחלונות:

     פתחו את פנקס הרשימות (התחל > עזרים).

    כתבו בתוכו "java hello" (בלי הגרשיים)

     לחצו על "קובץ > שמירה בשם". בשדה "שמור כסוג" בחרו All Files וכתבו בשם הקובץ "run.bat" ושמרו אותו באותה תיקייה של הקובץ hello.java.

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

  18. שאולי | 6/29/2011 1:47:07 AM

    הקוד היותר טוב לקבצי אצווה (.bat) שצריכים להריץ קובץ class הוא:

     

    echo off@                    - השתקת פקודת ה echo רישום ב cmd.              

    title run YourClass.class - שהתוכנית הרצה תיראה יותר מקצועית

    java hello                      - פקודת ההרצה

    pause                           - הפסקת התוכנית בסגירה ואחרי שהקובץ כבר הורץ וסגרו אותו

     

     

  19. פפפ | 8/28/2011 4:28:44 AM

    אני לא מצליח להורידJVM 

     

  20. שאולי | 6/19/2013 5:46:03 AM

    בס"ד

     

    על מנת להפוך קובץ jar שכבר נוצר לקובץ exe ניתן להרצה, אפשר להשתמש בתוכנה החינמית java4lunch ולמצוא מדריך ב youtube לתוכנה זאת. נבדק ונוסה...

  21. עופר | 11/6/2013 11:51:58 AM

    הי טל,

    קודם כל האתר שלך ממש טוב.

    ניסיתי את מה שכתבת על ה zip וכל זה אבל ככשיניתי את השם אז הוא פתח לי את החלון הדוס ואמר שחסר קובץ dll כלשהו.

    את הבעיה הזאת פטרתי על ידי גוגל, הורדתי תוכנה והיא סידרה את זה.

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

    איך פותרים את זה?

    אשמח לתשובה מהירה 

  22. וואו | 11/25/2013 3:33:13 PM

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

    אשמח לעוד מדריכים של ג'אווה

  23. jav | 12/4/2013 10:20:47 PM
    יש לי את הJRE, אבל לא הבנתי איך אני מריץ את התוכנית.

התגובות נעולות