فصل هفتم

 

نحوه ی اجرای پروژه ی کامپایل شده ی جاوا با مفسر جاوا (یا همان  java)

 

در فصل قبل یاد گرفتیم که چگونه پروژه ی خود را کامپایل کنیم و فایل های بایت کد (یعنی همان فایل های class.) را تولید کنیم.

بعد از اینکه فایل های بایت کد توسط javac تولید شد، حالا باید این فایل ها را توسط مفسر جاوا (یعنی ابزار java  که در jdk

هست)، اجرا کنیم.

 

 

 

ابتدا باید نگاهی به فلگ های java بندازیم. دستور java -help را در ترمینال وارد می کنیم.

Usage: java [-options] class [args.]
           (to execute a class)
   or  java [-options] -jar jarfile [args.]
           (to execute a jar file)
where options include:
    -d32      use a 32-bit data model if available
    -d64      use a 64-bit data model if available
    -server      to select the "server" VM
                  The default VM is server,
                  because you are running on a server-class machine.

    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose:[class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-search | -no-jre-restrict-search
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  include/exclude user private JREs in the version search
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>.|:<classname>]
    -enableassertions[:<packagename>.|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>.|:<classname>]
    -disableassertions[:<packagename>.|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
 

 

 

از بین این فلگ ها، فلگ cp- یا همان  classpath- برای ما خیلی مهم است. در واقع ما باید آدرس پکیج روت دایرکتوری رو بدیم به این فلگ.

به عبارت دیگر، زمانی که مفسر جاوا فایل Main.class را اجرا می کند، اگر در کلاس Main، کلاس هایی دیگری نیز import شده باشند، در آن صورت، مفسر، در ادرس پکیج روت دایرکتوری، شروع به گشتن به دنبال بایت کد آن کلاس ها می کند.

 

فرض کنید در فایل Main.class،  یک کلاسی import شده به نام Util و فایل Util.class نیز در پکیج com.blog قرار دارد و پوشه ی com نیز روی دسکتاپ قرار دارد. در آن صورت، "پکیج روت دایرکتوری" ما می شود home/linuxgeek/Desktop/

 

به عبارت دیگر، زمانی که مفسر جاوا فایل Main.class را اجرا می کند، به دنبال فایل Util.class می گردد (چون در کلاس مین import شده)، بنابراین، کامپایلر در پکیج روت دایرکتوری (  home/linuxgeek/Desktop/  )  شروع به گشتن به دنبال پکیج com.blog و فایل Util.class می کند.

 

 

نکته: اگر پکیج های ما در آدرس های مختلفی پراکنده باشند، در آن صورت ما چندین پکیج روت دایرکتوری داریم و باید آدرس همه ی آنها را بدهیم به classpath تا مفسر بتواند بایت کدها را پیدا کند. آدرس ها را نیز با علامت   :   از هم جدا می کنیم (در لینوکس با ; )

 

 

ببینید دوستان، زمان اجرای برنامه های جاوا، ممکن است سناریو های مختلفی پیش بیاید. مهمترین نکته ای که باید بدونید این هست که مفسر جاوا به دنبال فایل های class. می گردد برای اجرا کردن آنها. (حالا این فایل class. ممکن است درون یک فایل zip باشند، ممکن است درون یک فایل jar باشند و یا درون یک پوشه ی معمولی در سیستم فایل شما). این فایل ها در هر کجا که باشند، باید آدرس آن را بدهید به classpath تا مفسر بتواند آنها را پیدا کند.  اگر فقط همین نکته را به ذهن بسپرید تمومه.


 

 

طبق آنچه که از دستور java -help بدست آوردیم،  با ۲ روش کلی میشه پروژه های جاوا رو اجرا کرد. این دو روش رو در زیر می بینید.

 

Usage:

java [-options] class [args.] (to execute a class)

 or

java [-options] -jar jarfile [args.] (to execute a jar file)
 

 

 

در هر دوی این روش ها، بجای options-  می تونیم فلگ های مختلف رو قرار بدیم و برای ما فقط فلگ classpath مهمه. پس بجای option، فلگ cp را قرار می دهیم.

 

 

روش اول:

 


java -classpath path1;path2;file.zip;file.jar        path/to/Main.class          args
 

 

path1: ادرس پکیج روت دایرکتوری

path2: ادرس پکیج روت دایرکتوری

file.zip: فایل زیپ که می تواند حاوی پکیج ها و فایل های class.  باشد.

file.jar: فایل جار که می تواند حاوی پکیج ها و فایل های class.  باشد.

path/to/Main.class: ادرس فایل Main.class

args: آرگومان هایی که می خواهیم به متد main ارسال شوند

 

 

توجه:  به classpath باید آدرس پکیج روت دایرکتوری رو بدید تا مفسر جاوا بتونه در اون ادرس ها جستجو کنه و فایل های class. رو پیدا کنه  (حالا این فایل های class. میتونن داخل فایل زیپ باشن، یا داخل فایل جار، و یا در یک پوشه در سیستم فایل)

 

توجه: اگر classpath رو ندید به مفسر، بطور پیش فرض، current working directory به عنوان classpath تعیین میشه. به عبارت دیگر، زمانی که مفسر جاوا بخواهد دنبال پکیج ها و بایت کد ها بگردد، از ادرس فعلی  شروع می کند به گشتن.

 

 

روش دوم:

 


java     -classpath  path1;path2;file.zip;file.jar         -jar file.jar     args
 

 

این دستور رو زمانی اجرا می کنیم که پروژه رو کامپایل کردیم، و فایل های class. رو داخل یک فایل jar قرار دادیم و حالا می خواهیم که فایل jar رو اجرا کنیم.

 

در اینجا هم باید آدرس پکیج روت دایرکتوری رو بدیم به classpath تا مفسر جاوا بتونه فایل های class. رو پیدا کنه. در اینجا اگرچه ما پروژه ی خودمون رو به jar تبدیل کردیم، ولی ممکنه از کلاس هایی استفاده کنیم که خود اون کلاس ها در یک فایل jar دیگه قرار داشته باشند. در آن صورت، باید آدرس اون فایل jar رو بدیم به classpath

 

(ما حتی می تونستیم اون فایل jar رو که به عنوان لایبرری استفاده کردیم، در فایل jar خودمون embed کنیم)

 

پس میبینید که سناریو های مختلف و عجیب غریبی ممکنه پیش بیاد. در هر صورت یادتون باشه، مفسر جاوا باید بتونه فایل های  class. رو پیدا کنه.

در کجا سرچ میکنه؟ در پکیج روت دایرکتوری.

آدرس پکیج روت دایرکتوری رو به کجا باید بدیم؟ به classpath

 

 

خب، من فکر میکنم هر انچه لازم بود رو درباره مفسر جاوا به شما گفتم. در فصل سناریو های مختلفی رو بررسی میکنم.

 

 

بازگشت به فهرست اصلی

 

 

 


مشخصات

آخرین ارسال ها

آخرین جستجو ها