لینوکس، عشق، برنامه نویسی

لینوکس، عشق، برنامه نویسی

در این وبلاگ مطالبی درباره سیستم عامل لینوکس و همچنین درمورد برنامه نویسی و کامپیوتر مینویسم.

 

فصل هفتم

 

نحوه ی اجرای پروژه ی کامپایل شده ی جاوا با مفسر جاوا (یا همان  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

 

 

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

 

 

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

 

 

 

۰ نظر ۰۲ اسفند ۰۰ ، ۰۱:۰۳
Linux-Geek

 

فصل چهارم

مفهوم current working directory

 

در این فصل، به مفهوم current working direcctory (من بهش میگم آدرس فعلیcheeky) در شل لینوکس و همچنین شل ویندوز (command prompt) می پردازیم. دانستن این مساله به کامپایل سورس های جاوا کمک میکنه

 

خیلی خلاصه بخوام بگم، current working directory، به ادرسی گفته می شود که شل ما در حال حاضر در آن قرار دارد. در دنیای لینوکس، عموما توزیع های لینوکسی از شل bash استفاده می کنند و برای دیدن آدرس فعلی، از دستور pwd استفاده می کنیم.

 

ترمینال رو باز میکنم و دستور pwd رو می زنم و خروجی پایین رو به من نشون میده.

 
[linuxgeek@linux-hp ~]$ pwd
/home/linuxgeek
 

این خروجی نشون میده که شل بش در حال حاضر در آدرس home/linuxgeek/ قرار داره. یعنی current working directory ما این هست home/linuxgeek/

 

حالا فرض کنید من توی هوم، یک پوشه دارم به نام video

 

حالا با دستور cd video وارد دایرکتوری ویدیو میشم.  حالا دوباره دستور pwd رو میزنم و خروجی زیر رو نشون میده:

 

  
[linuxgeek@linux-hp video]$ pwd
/home/linuxgeek/video
 

همونطور که می بینید، آدرس دایرکتوری فعلی من شد این home/linuxgeek/video/

 

حالا این مساله چه ربطی به جاوا داره؟
زمانی که ما بخوایم پروژه ای رو بصورت دستی کامپایل کنیم، باید کامپایلر جاوا رو از طریق شل اجرا کنیم و کامپایلر جاوا، مقدار بعضی فلگ هاش رو برابر با current working directory قرار میده. بنابراین مهمه که بدونیم بدونیم ادرس فعلی ما در شل چی هست و از کدام آدرس داریم کامپایلر رو اجرا میکنیم. در فصل های بعدی بیشتر توضیح میدم.

 

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

 

 

۰ نظر ۳۰ بهمن ۰۰ ، ۰۰:۳۴
Linux-Geek

 

فصل اول

 

مقدمه

 

 

سلام. به این آموزش متنی خوش اومدید. در این مجموعه پست ها، یاد می گیریم که چگونه یک پروژه ی java  رو از صفر تا 100 بصورت دستی (بدون IDE) ایجاد، و کامپایل، و اجرا کنیم و سپس از برنامه خروجی گرفته و تبدیل به یک فایل JAR بکنیم. و همچنین چگونه از لایبرری های jar استفاده کنیم.

 

در این اموزش، نکات زیادی یاد خواهید گرفت که شاید پس از سال ها برنامه نویسی در جاوا هنوز نمی دونستید! این آموزش در ۸ فصل نوشته شده و توصیه می کنم فصل ها رو به ترتیب برید جلوwink.

 

 

قبلا در این پست توضیح دادم که چرا نباید از IDE استفاده کنیم و برای همین قصد ندارم دوباره همون مطالب رو تکرار کنم. اگر نمی دونید چرا باید یک پروژه ی جاوا رو بصورت دستی ایجاد کنید، حتما به اون پست سر بزنید.

 

من در این آموزش ها از jdk  ورژن  1.8  استفاده کردم، چون jdk 9  یه مقدار ساختارش فرق کرده، بنابراین ساختار پروژهای جاوا ۸ با جاوا ۹ (و بالاتر) فرق کرده. ولی جای نگرانی نیست، من هردوتاش رو توضیح میدم، شما فقط قدم به قدم با آموزش ها همراه باشید.

 

همچنین سیستم عامل من لینوکس هست ولی شما می تونید در ویندوز هم به راحتی این آموزش ها رو پیاده سازی کنید.

 

 

 

توجه: دقت کنید که این پست برای اموزش جاوا نیست. من فرض رو بر این گذاشتم که شما جاوا رو از قبل بلد هستید و میتونید پروژه های جاوا رو در Eclipse یا Intellij یا Netbeans به راحتی انجام بدید. پس اگر جاوا رو بلد نیستید و قبلا کار نکردید و نمیتونید توی این IDE ها پروژه بسازید، این آموزش به در شما نمیخوره.

 

 

و نکته ی آخر:

اگر بخواهیم بصورت دستی همه ی کارها رو در جاوا انجام بدیم، لازم است که با چندین مفهوم، قشنگ اشنا باشیم، از جمله مفهوم پکیج در جاوا، مفهوم کامپایلر، مفهوم مفسر، مفهوم ادرس فعلی در شل یا current working directory و اینجور بحث ها،  که  من در فصل های بعدی درباره هر کدام از این ها مفصل توضیح دادم. پس با من همراه باشیدsmiley

 

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

 

۰ نظر ۲۹ بهمن ۰۰ ، ۲۳:۳۳
Linux-Geek

 

کامپایل و اجرای پروژه های جاوا بدون نیاز به IDE

 

 

 

 

فصل اول: مقدمه

فصل دوم:  مفهوم jdk

فصل سوم: مفهوم پکیج در جاوا

فصل چهارم: مفهوم current working directory در شل

فصل پنجم: مفهوم کامپایل و اجرا در جاوا

فصل ششم: نحوه ی کامپایل سورس کد های جاوا با کامپایلر جاوا ( یا همان javac)

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

فصل هشتم: ایجاد و کامپایل و اجرای پروژهای جاوا با سناریو های مختلف: سناریوی اول

فصل نهم: ایجاد و کامپایل و اجرای پروژهای جاوا با سناریو های مختلف: سناریوی دوم

 

 

 

 

این پست در دست تکمیل است (هنوز کامل نشده)
 

۰ نظر ۲۹ بهمن ۰۰ ، ۲۳:۲۴
Linux-Geek