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

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

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

 

فصل هفتم

 

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

 

فصل ششم

 

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

 

خب همانطور که در فصل های گذشته دیدیم، ابزار javac یکی از ابزار های jdk هست که برای کامپایل سورس کدهای جاوا به کار می رود. چون نرم افزار javac، رابط گرافیکی یا همان GUI ندارد بنابراین باید از طریق ترمینال ان را اجرا کنیم تا برنامه را کامپایل کنیم. اما ابتدا باید نگاهی به فلگ های (flag) ان داشته باشیم.

 

توجه: jdk من ورژن 1.8 هست، jdk 9 یه مقدار تفاوت کرده که بعدا توضیح میدم.

 

ابتدا در ترمینال دستور javac -help رو می زنیم تا ببینیم چه فلگ هایی داره

 

 
Usage: javac <options> <source files>

where possible options include:

  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings
  -verbose                   Output messages about what the compiler is doing
  -deprecation               Output source locations where deprecated APIs are used
  -classpath <path>          Specify where to find user class files and annotation processors
  -cp <path>                 Specify where to find user class files and annotation processors
  -sourcepath <path>         Specify where to find input source files
  -bootclasspath <path>      Override location of bootstrap class files
  -extdirs <dirs>            Override location of installed extensions
  -endorseddirs <dirs>       Override location of endorsed standards path
  -proc:{none,only}          Control whether annotation processing and/or compilation is done.
  -processor <class1>[,<class2>,<class3>...] Names of the annotation processors to run; bypasses default discovery process
  -processorpath <path>      Specify where to find annotation processors
  -parameters                Generate metadata for reflection on method parameters
  -d <directory>             Specify where to place generated class files
  -s <directory>             Specify where to place generated source files
  -h <directory>             Specify where to place generated native header files
  -implicit:{none,class}     Specify whether or not to generate class files for implicitly referenced files
  -encoding <encoding>       Specify character encoding used by source files
  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version
  -profile <profile>         Check that API used is available in the specified profile
  -version                   Version information
  -help                      Print a synopsis of standard options
  -Akey[=value]              Options to pass to annotation processors
  -X                         Print a synopsis of nonstandard options
  -J<flag>                   Pass <flag> directly to the runtime system
  -Werror                    Terminate compilation if warnings occur
  @<filename>                Read options and filenames from file
 

 

همانطور که می بینید، در خط اول، نحوه ی استفاده از کامپایلر جاوا را توضیح داده.

 
<javac <options> <source files
 

 

بجای <options> ما می توانیم چندین تا از فلگ های بالا رو بزاریم.

 

اما ۳ تا از فلگ ها برای ما خیلی مهم هستن.

۱- فلگ sourcepath-

۲- فلگ classpath-

۳- فلگ d-

 

فلگ sourcepath

فلگ sourcepath-  همانطور که از اسمش پیداست، ادرس سورس کدهای پروژه را مشخص می کند. به عبارت دقیق تر، ادرس "پکیج روت دایرکتوری" پروژه را. و به عبارت دیگر، javac از این ادرس شروع میکنه به گشتن پکیج ها و فایل های java.

 

به فرض اگر تمام پکیج های پروژه داخل پوشه ی src باشند، مقدار sourcepath می شود آدرس پوشه ی src

 

 

نکته ی بسیار مهم۱: در جاوا این امکان وجود دارد که همه، (یا برخی) از پکیج های  پروژه ی ما، داخل فایل jar یا حتی داخل فایل zip باشد. به عبارت دیگر ما می توانیم یک فایل zip داشته باشیم که برخی از  پکیج ها و سورس کد ما (فایل های java.) داخل آن باشد. بنابراین ادرس فایل های زیپ و جار رو هم باید بدیم به sourcepath

 

حالا اگر پکیج های ما هر کدام در یک ادرسی باشند (فرض کنید یک پکیج در درایو F و دیگری در درایو D باشد و یک پکیج ما نیز در داخل یک فایل zip باشد)، در آن صورت، سه تا پکیج روت دایرکتوری داریم، و مقدار sourcepath میشه آدرس هر سه تای آنها ( که با علامت : از هم جدا شده اند) (در لینوکس با علامت ; از هم جدا  می شوند). به عبارت دیگر، زمانی که javac بخواهد دنبال پکیج ها و سورس کدها بگردد، باید ۲ تا ادرس را جستجو کند به اضافه محتویات یک فایل zip را.

 

نکته ی بسیار مهم۲: زمانی که شما فلگ sourcepath رو به javac ندهید،  javac مقدار sourcepath را معادل current working directory در نظر می گیرد. به عبارت دیگر، اگر شما فلگ sourcepath را به javac ندهید، javac از ادرس فعلی شروع می کند به گشتن پکیج ها و کلاس ها

 

 

فلگ classpath

فلگ classpath-  نیز همانطور که از اسمش پیداست، ادرس کلاس های کامپایل شده را مشخص می کند. به عبارت دقیق تر، ادرس "پکیج روت دایرکتوری" فایل های class. را

و به عبارت دیگر، زمانی که javac بخواهد دنبال پکیج ها و فایل های کامپایل شده بگردد، از این ادرس شروع می کند به گشتن

 

فرض کنید کسی قبلا در جاوا کلاس Util را نوشته و آن را کامپایل کرده، و فایل Util.class را به شما داده

 

(هر چند که مرسوم نیست فایل کامپایل شده ی جاوا رو همینجوری بدیم به کسی، روش بهتر این هست که بزاریم داخل یک فایل jar و فایل jar رو بدیم به طرف. این فایل jar در واقع میشه همان لایببری)

 

ولی حالا بیاید فرض کنیم که این اتفاق افتاده و کلاس کامپایل شده (فایل Util.class)  رو از دوستتون گرفتید، و ازش در پروژه استفاده کردید. حالا زمانی که بخواهید پروژه ی خودتون رو کامپایل کنید، باید ادرس "پکیج روت دایرکتوری" اون فایل class. رو، بدید به فلگ classpath

 

به فرض اگر کلاس Util در پکیج com.lib باشد، معنیش این هست که فایل Util.class  داخل پوشه ی lib و پوشه ی lib داخل پوشه ی com هست. درسته؟

 

حالا اگر پوشه ی com در ادرس  home/linuxgeek/  باشد، این ادرس می شود پکیج روت دایرکتوری فایل Util.class

 

به عبارت دیگر، زمانی که javac بخواهد دنبال پکیج com.lib و فایل Util.class بگردد، از ادرس home/linuxgeek/ شروع می کند به جستجو

 

 

 

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

 

حالا اگر فایل های کامپایل شده ی ما، هر کدام در یک ادرسی باشند (فرض کنید یک پکیج در درایو F و دیگری در درایو D باشد و یک پکیج ما نیز در داخل یک فایل zip باشد)، در آن صورت، سه تا پکیج روت دایرکتوری داریم، و مقدار classpath میشه آدرس هر سه تای آنها ( که با علامت : از هم جدا شده اند) (در لینوکس با علامت ; از هم جدا  می شوند). به عبارت دیگر، زمانی که javac بخواهد دنبال bytecode ها بگردد، باید ۲ تا ادرس را جستجو کند به اضافه محتویات یک فایل zip را.

 

نکته ی بسیار مهم۲: زمانی که شما فلگ classpath رو به javac ندهید،  javac مقدار classpath را معادل current working directory در نظر می گیرد. به عبارت دیگر، اگر شما فلگ sourcepath را به javac ندهید، javac از ادرس فعلی شروع می کند به گشتن پکیج ها و کلاس ها  (دقیقا مثل sourcepath)

 

 

 

فلگ d-

زمانی که javac فایل های سورس را کامپایل می کند، به طور پیش فرض، فایل بایت کد را (class.) کنار همان سورس کد ایجاد می کند.  اگر بخواهیم فایل های بایت کد، به طور کلی در یک ادرس دیگر ایجاد شوند، از فلگ d- استفاده می کنیم. در این صورت، کامپایلر ابتدا پکیج های مربوطه را بصورت خودکار ساخته، و فایل های بایت کد را در پکیج های مربوط به خودشان قرار می دهد.

 

به عبارت دیگر، ما باید ادرس "پکیج روت دایرکتوری" مد نظر خودمان را بدهیم به فلگ d- تا کامپایلر  در آن ادرس پکیج ها و بایت کد ها را بسازد

 

اکلیپس نیز با استفاده از فلگ d- در کنار پوشه ی src یک پوشه می سازد به نام bin و پکیج ها را داخل آن قرار می دهد (به همراه فایل های کامپایل شده)

 

دستور کامپایل در جاوا

تا اینجا همه چیز رو درباره javac و فلگ های اون گفتم. برای اینکه صحبت هارو جمع بندی کنم، دستور کلی کامپایل در جاوا رو در زیر می نویسم

 
 javac -sourcepath     path1;path2;file.zip;file.jar          -classpath     path1;path2;file.zip;file.jar    path/to/Main.java
 

 

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

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

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

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

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

 

 

و نکته ی پایانی اینکه، زمانی که شما فقط ادرس فایل Main.java رو به کامپایلر میدید،  کامپایلر به طور اتوماتیک، تمام کلاس هایی که در Main.java ایمپورت شدن رو پیدا میکنه و انها رو هم کامپایل میکنه. چجوری پیدا میکنه؟ با گشتن درون پکیج روت دایرکتوری و فایل های zip و jar

 

 

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

 

 

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

 

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

 

در این فصل، خیلی کوتاه و مختصر به مفهوم کامپایل و اجرای برنامه های جاوا می پردازیم.

 

همانطور که در فصل های قبلی اشاره کردم،  زبان برنامه نویسی جاوا، هم یک زبان compiled language هست و هم یک زبان interpreted language. به عبارت دیگر، زبان برنامه نویسی جاوا هم دارای کامپایلر هست و هم دارای مفسر(یا interpreter)، درست بر خلاف زبان های دیگر که یا فقط کامپایلر دارند (مانند C ) و یا مفسر دارند (مانند پایتون).

 

در واقع وقتی به زبان جاوا برنامه نویسی می کنیم، ابتدا سورس کدهای ما ( ینی فایل های java. )،  توسط کامپایلر به بایت کد تبدیل می شوند (یعنی به فایل های class. )

و سپس interpreter یا مفسر جاوا میاد و فایل های class. رو اجرا می کنه و پروژه ی ما اجرا میشه.

 

زمانی که شما از IDEها (مثل eclipse ) استفاده می کنید، نه کامپایلر رو می بینید و نه مفسر رو. در واقع اکلیپس در پشت پرده از کامپایلر جاوا استفاده کرده و سورس کد را کامپایل، و سپس فایل های class. تولید شده را با استفاده از مفسر جاوا اجرا می کند.

 

تمام مطالبی که در این پنج فصل خواندیم، برای این بود که بتوانیم همه ی این کار ها را بصورت دستی و بدون نیاز به eclipse انجام بدیم.

برای این منظور نیاز هست که بتوانیم ابزار javac (کامپایلر جاوا)  و ابزار java (مفسر جاوا)  را  در شل اجرا کنیم و با فلگ های انها به خوبی اشنا باشیم.

 

در فصل بعد میریم سراغ javacwink

 

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

 

 

۰ نظر ۳۰ بهمن ۰۰ ، ۰۰:۵۰
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

 

فصل سوم

 

مفهوم پکیج در جاوا

 

 

پکیج در جاوا چیست؟

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

 

طبق تعریفی که در سایت خود اوراکل اومده:

"A package is a namespace that organizes a set of related classes and interfaces"

 

یعنی پکیج، یک فصای نام (namespace) است که یک گروهی از کلاس ها و اینترفیس ها را سازماندهی می کند. به زبان خودمانی اگر بخوام بگم، در داخل یک پکیج، مجوعه ای از کلاس ها و اینترفیس های مرتبط قرار می گیرد.

 

خب نحوه ی نام گذاری پکیج ها رو هم همه می دونید که با نقطه از هم جدا می شن. مثلا به این شکل   com.blog.linuxgeek  

 

اما نکته ی مهمی که باید بدونید این هست که پکیج های جاوا در واقع همان پوشه ی (folder) معمولی هستند!

 

برای مثال، وقتی میگیم که داخل پوشه ی src یک پکیج به نام com.second.packege می سازیم، معنیش این هست که

۱- داخل پوشه ی src ابتدا یک پوشه می سازیم به نام com

۲- سپس داخل پوشه ی com یک پوشه ی دیگر می سازیم به نام second

۳- و سپس داخل پوشه ی second یک پوشه ی دیگه می سازیم به نام packege

در واقع، اکلیپس و سایر ideها هم همینکار رو می کنند، اگر در اکلیپس، پکیج بالایی را درست کنید و سپس، از طریق فایل منیجر سیستم عامل، برید به پوشه ی src، می بینید که یک پوشه درست شده به نام com، سپس در داخل آن یک پوشه درست شده به نام second، و سپس در داخل اون یک پوشه درست شده به نام package

 

نکته ی دیگری که باید بدونید این هست که، در فرهنگ برنامه نویسی جاوا مرسوم هست که تمام پکیج ها در داخل پوشه ی src قرار می گیرند، اما چنین چیزی به هیچ وجه اجباری نیست. یعنی شما می توانید یک پکیج را در دایرکتوری هوم قرار دهید و پکیج دیگر را در دسکتاپ ( به همین ترتیب در ویندوز می توانید یک پکیج را در درایو D قرار دهید و پکیج دیگر را در درایو F )

بنابراین، قرارگیری پکیج های یک پروژه در داخل پوشه ی src اجباری نیست ( اما همانطور که گفتم مرسوم است).

 

اما اینکه اگر پکیج های یک پروژه در مکان های مختلف قرار بگیرند در آن صورت پروژه چگونه کامپایل و اجرا خواهد شد؟ این نکته ای هست که در فصل های بعد به آن خواهیم پرداخت.

 

 

package root directory   چیست؟

ممکن است در برخی سایت ها اصطلاح بالا را دیده باشید. منظور از پکیج روت دایرکتوری، پوشه ای است که پکیج ها داخل آن قرار می گیرند. برای مثال، اگر تمام پکیج های پروژه ی ما در داخل پوشه ی src قرار بگیرند، ادرس پوشه ی src می شود پکیج روت دایرکتوری.

 

مثلا فرض کنید که ما یک پروژه داریم به نام myproject و ادرس آن چنین است:

home/manjaro-user/myproject/src/

و پکیج com.blog.linuxgeek در  داخل پوشه ی src قرار دارد. 

 

حالا اگر برید به ادرس home/manjaro-user/myproject/src/ می بینید که در داخل پوشه ی src :

یک پوشه هست به نام com

و در داخل پوشه ی com یک پوشه هست به نام blog

و در داخل پوشه ی blog یک پوشه هست به نام linuxgeek

و در داخل پوشه ی linuxgeek کلاس های ما قرار دارند.

 

حالا، پکیج روت دایرکتوری ما میشه پوشه ی src و ادرس اون میشه home/manjaro-user/myproject/src/

 

چرا پکیج روت دایرکتوری ما میشه پوشه ی src ؟  برای اینکه پکیج های پروژه داخل اون هستند.

 

حالا اگر ما پکیج های پروژه رو هرکدام رو در جایی قرار بدیم چی؟  در ان صورت ما چندین پکیج روت دایرکتوری داریم و موقع کامپایل باید ادرس همه ی پکیج روت دایرکتوری ها رو بدیم به کامپایلر! (در فصل بعد میگم)

 

کاربرد package root directory چیست و چرا لازم است؟

در واقع، وقتی پکیج روت دایرکتوری را به کامپایلر می دهیم،  کامپایلر از اون ادرس شروع میکنه به گشتن و پیداکردن پکیج ها و کلاس ها! (در فصل های بعدی اینو بازم بیشتر توضیج میدم)

 

 

و نکته ی پایانی مهمی که باید بدانید این هست که در جاوا، هیچ کلاسی وجود ندارد که خارج از پکیج قرار بگیرد. در واقع هیچ کلاسی نمی توان ساخت که داخل یک پکیج نباشد. اگر یک کلاس را داخل پکیج نگذاریم، موقع کامپایل، خود کامپایلر یک پکیج می سازد به نام  default package، و کلاس را داخل آن قرار می دهد.

 

این مساله را می توانید در eclipse هم مشاهده کنید. زمانی که در اکلیپس کلاس می سازید، اگر برای کلاس، پکیج تعریف نکنید، خود اکلیپس برای شما default package می سازد و کلاس را داخل آن قرار می دهد. (برای دیفالت پکیج، هیچ پوشه ای در سیستم فایل کامپیوتر ایجاد نمی شود)

 

و همچنین سعی کنید هیچوقت کلاسی را داخل دیفالت پکیج قرار ندید. چرا؟ برای اینکه کلاسی که در داخل دیفالت پکیج قرار دارد، از داخل کلاس هایی که درون سایرپکیج ها قرار دارند قابل import شدن نیست.

 

همانطور که در عکس های زیر می بینید، ما یک کلاس Main ساختیم و داخل هیچ پکیجی قرار ندادیم و اکلیپس اتوماتیک ان را داخل default package قرار داد.

 

 

 

 

 

 

و سوالی که پیش میاد این است که وقتی کلاسی در داخل دیفالت پکیج قرار بگیرد، در کجای سیستم عامل و در کدام پوشه جا می گیرد؟

جواب: اگر منظورتون در اکلیپس هست، اکلیپس اون رو در داخل پوشه ی src می سازه، و اکلیپس (از طریق تنظیماتش)، موقع کامپایل کردن پروژه، ادرس پوشه ی src رو به عنوان "پکیج روت دایرکتوری" میده به کامپایلر.  اما اگر شما خودتون پروژه رو بصورت دستی ایجاد کنید، عملا می توانید این کلاس را در هر کجای سیستم قرار بدید. فقط موقع کامپایل، باید ادرسش رو بدید به کامپایلر تا آن را کامپایل کند، ولی عملا این کلاس به درد شما نخواهد خورد!! چرا؟ چون همانطور که در بالا هم گفتم، از داخل کلاس هایی که درون یک پکیج قرار دارند، نمی توانید این کلاس را import کنید، پس عملا یعنی نمی توانید از این کلاس و متد هایش بهره ای ببرید!smiley

 

خب، فکر میکنم هرآنچه را که لازم بود، درباره پکیج ها در جاوا دونستیم . بریم فصل بعدیsmiley

 

 

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

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

 

فصل دوم

 

Java Development kit (یا به اختصار jdk) چیست؟

 

همانطور که خیلی از شماها، بهتر از من می دانید،  زبان جاوا، بطور همزمان، هم یک زبان کامپایل شدنی هست، و هم یک زبان تفسیر شونده. به عبارت دیگر، زبان جاوا هم دارای کامپایلر می باشد و هم دارای مفسر. حالا در این فصل می خواهیم به مفهوم java development kit یا به اختصار JDK بپردازیم و ببینیم که کامپایلر  و مفسر جاوا در کجا قرار دارند.

 

واقعیت این است که زبان برنامه نویسی جاوا فقط یک کامپایلر تنها نیست، بلکه مجموعه ای از ابزار ها(نرم افزار ها) هست که در کنار هم قرار میگیرند و java development kit را تشکیل میدهند. اصلا مفهوم واژه ی کیت یعنی مجموعه ای از ابزارها.

 

در داخل jdk ابزار های (نرم افزار های) مختلفی قرار دارند که هر کدام نقشی را در ساختن و اجرا کردن و منتشر کردن برنامه های جاوا ایفا می کنند. برای مثال، ابزار javac  وظیفه ی کامپایل کردن سورس کد رو برعهده داره، و یا ابزار java وظیفه ی اجرای برنامه های جاوا رو بر عهده داره.

یا مثلا ابزار javadoc وظیفه ی خواندن داکیومنت ها از سورس کد و تولید داکیومنت رو برعهده داره. یعنی ما می توانیم مجموعه ی از سورس کد ها رو به این ابزار بدیم، و این ابزار میتونه تمام داکیومنتیشن های داخل سورس هارو استخراج کنه و یک فایل html به عنوان داکیومنت برای ما تولید کنه.

 

و یا مثلا ابزار jar یکی دیگه از ابزارهایی هست که داخل jdk قرار داره و ما بوسیله ی این ابزار میتونیم از پروژه ی خودمون یک فایل jar تولید بکنیم.

 

حالا، مجموعه ی این ابزار ها(نرم افزارها) در کنار هم قرار می گیرند و jdk رو تشکیل می دهند.

 

و در پایان، مهمترین نکته ای که باید بدونید این هست که:

وقتی میگم ابزار، منظور من همون نرم افزار هست. یعنی هر کدوم از این ابزار ها در واقع یک نرم افزار مستقل هستند (یعنی یک فایل اجرایی هستند) که به زبان C نوشته شدن!! به عبارت دیگر می شود گفت که  زبان جاوا رو با C نوشتن! 

این نرم افزار ها، GUI یا رابط گرافیکی ندارند و برای استفاده از اون ها نیاز به ترمینال (در لینوکس) و کامند پرامپت (در ویندوز) دارید. 

 

سوالی که پیش میاد اینه: این ابزار هارو کجا میشه دید؟

جواب: داخل پوشه ی JDK

 

باید برید به داخل پوشه ی jdk و سپس برید به داخل پوشه ی bin

bin مخفف binary هست و در پوشه ی bin شما میتونید فایل اجرایی تمام ابزار های jdk (از جمله فایل اجرایی کامپایلر و مفسر جاوا) رو ببینید که با زبان C نوشته شده اند.

 

ذکر این نکته لازم است که jdk که در عکس می بینید ورژن 1.8 می باشد

 

 

 

خب همونطور که در عکس میبینید، jdk ابزار های زیادی داره، همانطور که در بالا هم گفتم، هر کدوم از این ابزار ها در واقع یک نرم افزار مستقل هستند (یک فایل اجرایی هستند) که به زبان C نوشته شدن.

 

چندتا ابزار در تصویر میبینید؟ من چندتاشو نام می برم:

 

۱- java که همون مفسر یا interpreter جاوا هستش و کارش اینه که bytecode هارو اجرا کنه ( همون فایل های class. رو )

۲- javac که همون کامپایلر جاوا هستش و وظیفه ی اون، کامپایل سورس کد جاوا (java.) به فایل های بایت کد (class.) هست.

۳- jar که همون ابزاری هستش که بوسیله ی اون فایل های jar. رو تولید میکنیم

۴- javadoc که بوسیله ی اون از روی سورس ها میتونیم داکیومنت تولید کنیم

۵- و سایر ابزار ها

 

زمانی که شما از IDEها (مثل eclipse ) استفاده می کنید، نه کامپایلر رو می بینید و نه مفسر رو. در واقع اکلیپس در پشت پرده، از این ابزارهای jdk استفاده کرده و سورس کد را کامپایل، و سپس فایل های class. تولید شده را با استفاده از مفسر جاوا اجرا می کند و نتیجه را به شما نشان می دهد.

 

مطلب بعدی که باید بدونید این هست که:
هر کدام از این ابزارها،  چندین فلگ (flag) دارن. برای دیدن فلگ های هر کدام از اینها کافیه که ترمینال(در لینوکس) و یا cmd (در ویندوز) رو باز کنید و از دستور help-  استفاده کنید.

مثلا برای دیدن فلگ های jar از دستور jar -help استفاده کنید که خروجی زیر رو به شما میده.

 
Illegal option: h
Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
Options:
    -c  create new archive
    -t  list table of contents for archive
    -x  extract named (or all) files from archive
    -u  update existing archive
    -v  generate verbose output on standard output
    -f  specify archive file name
    -m  include manifest information from specified manifest file
    -n  perform Pack200 normalization after creating a new archive
    -e  specify application entry point for stand-alone application
        bundled into an executable jar file
    -0  store only; use no ZIP compression
    -P  preserve leading '/' (absolute path) and ".." (parent directory) components from file names
    -M  do not create a manifest file for the entries
    -i  generate index information for the specified jar files
    -C  change to the specified directory and include the following file
If any file is a directory then it is processed recursively.
The manifest file name, the archive file name and the entry point name are
specified in the same order as the 'm', 'f' and 'e' flags.

Example 1: to archive two class files into an archive called classes.jar:
       jar cvf classes.jar Foo.class Bar.class
Example 2: use an existing manifest file 'mymanifest' and archive all the
           files in the foo/ directory into 'classes.jar':
       jar cvfm classes.jar mymanifest -C foo/ .
 

 

همانطور که در خروجی بالا می بینید، ابزار jar، فلگ های زیادی داره،   c  -t   -x-   و سایر فلگ ها.

 

ما بیشتر با دوتا ابزار jdk کار خواهیم داشت. یکی ابزار javac که کامپایلر جاوا هست و دیگری ابزار java که مفسر جاوا هست.  هر کدام از این ها، تعدادی فلگ دارن ( می تونید دستور help- رو بزنید و همه ی فلگ هاش رو ببینید). دوتا از فلگ ها برای ما مهمه. یکی فلگ classpath-   و دیگری فلگ   sourcepath-  که در فصل های بعد توضیح میدم.

 

 

و نکته ی پایانی اینکه:

اگر میخاید در مورد هر کدوم از این ابزار ها اطلاعات کسب کنید و توضیحات کامل فلگ ها رو، بهتره برید به وبسایت خود اوراکل به این ادرس

 

 

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

۰ نظر ۳۰ بهمن ۰۰ ، ۰۰:۰۱
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

سلام

در این پست میخام درباره ی ایونت هندلینگ در جاوا با استفاده از Anonymous class توضیحاتی بدم.

 

به قطعه کد زیر نگاه کنید.

 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class Main {

        public static void main(String[] args) {
     
                JButton btn = new JButton();

                btn.addActionListener( new ActionListener() {
                        
                        @Override
                        public void actionPerformed(ActionEvent e) {

                                System.out.println("Hello World!");
                            }
                    });
            }
    }
 

 

همه ی ما می دونیم که

۰ نظر ۰۹ مهر ۰۰ ، ۱۳:۳۸
Linux-Geek

 

 

برنامه نویسی بدون IDE برای خیلی ها قابل تصور نیست، اما در این پست کوتاه، میخواهیم ببینیم که چرا نباید از IDE استفاده کنیم.

 

بسیاری از برنامه نویسان تازه کار (و همچنین حرفه ای)، مخصوصا برنامه نویسانی که دات نت یا جاوا کار میکنن، برای برنامه نویسی از IDE استفاده میکنن. محیط برنامه نویسی Visual studio و Eclipse و Iintellij IDE و Netbeans چهارتا از بهترین ide های شناخته شده برای برنامه نویسی هستن که اکثر زبان ها رو پوشش میدن و

۰ نظر ۱۳ خرداد ۰۰ ، ۲۲:۲۹
Linux-Geek

 تبدیل تاریخ در جاوا با کتابخانه icu4j شرکت IBM

 

دوستان سلام. من میخاستم تاریخ شمسی رو به میلادی و قمری در زبان جاوا تبدیل کنم. بعد از چندین روز جستجوی های فراوان و صرف وقت بسیار، در نهایت تونستم این کار رو بکنم. در این پست می خوام به شما هم آموزش بدم تا وقت شما مثل من تلف نشه

 

در این پست می خوام اموزش تبدیل انواع تاریخ (شمسی به میلادی، شمسی به قمری، میلادی به شمسی، میلادی به قمری، قمری به شمسی و قمری به میلادی) رو آموزش بدم.

 

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

 

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

۱۱ نظر ۲۱ بهمن ۹۸ ، ۱۶:۱۱
Linux-Geek

به نام خدا

 

 


در این مقاله میخوام به طور مختصر و کوتاه به معرفی فریم ورک GTK بپردازم

 
اگر شما هم مثل من به نرم افزار های گرافیکی علاقه داشته باشید و کنجکاو باشید که بدونید یک نرم افزار (مثل فتوشاپ یا فایرفاکس و ...) به چه زبانی نوشته شدن, باید با مفهوم فریم ورک های گرافیکی(مثل GTK و Qt و غیره ) اشناتون کنم.
 

 
تعریف فریم ورک:

فریم ورک به کدهایی گفته میشو که به یک زبان خاص (مثلا  c یا ++c یا جاوا و ...) و برای اهداف خاصی نوشته می شوند
 
برای ایجاد رابط کاربری یا همون GUI نرم افزارها ( یا به قول خودمون، ظاهر برنامه ها ), از فریم ورک های مختلفی استفاده میشه. یکی از معروف ترین اونها که اوپن

۱ نظر ۰۸ خرداد ۹۸ ، ۲۲:۱۷
Linux-Geek

به نام خدا

 

 

در این پست می خوام به معرفی کتابخانه بسیار خوب و قدرتمند jsoup بپردازم و با مثال هایی نحوه استفاده از اون رو نشون بدم، پس با من همراه باشید 

 

jsoup چیست؟ 

کتابخانه jsoup در جاوا، کتابخانه ی قدرتمندیست و دارای متد ها و کلاس های زیادی هست که برای آنالیز و تجزیه و تحلیل و استخراج اطلاعات مورد نیاز از سورس صفحات HTML به کار می رود. برای مثال، فرض کنید که شما سورس یک صفحه Html رو دارید به شکل زیر:

 

 

<!DOCTYPE html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>10.10.34.34</title>
   </head>

   <body>
       <div class="items">      
         <ul>
            <li><a href="http://www.google.com">برو به گوگل</a></li>
            <li><a href="http://www.facebook.com">برو به فیسبوک</a></li>
            <li><a href="http://www.gmail.com">برو به جیمل</a></li>
            <li><a href="http://www.twitter.com">برو به توییتر</a></li>
         </ul>
      </div>

      <div class="portfolio-item pi8">
         <h3 style="background-position: center -610px;"></h3>
         <ul style="color:#804e29;">
            <li><a href="http://peyvandha.ir/8-2.htm">بورس و سرمایه گذاری</a></li>
            <li><a href="http://peyvandha.ir/8-3.htm">فروشگاه اینترنتی</a></li>
            <li><a href="http://peyvandha.ir/8-3.htm">کامپیوتر و تلفن همراه</a></li>
            <li><a href="http://peyvandha.ir/8-4.htm">تجارت و خدمات </a></li>
            <li><a href="http://peyvandha.ir/8-4.htm">تبلیغات و نیازمندی ها </a></li>
            <li><a href="http://peyvandha.ir/8-5.htm">اشتغال و کارآفرینی </a></li>
            <li><a href="http://peyvandha.ir/8-6.htm">تولیدی و صنعتی </a></li>
            <li><a href="http://peyvandha.ir/8-6.htm">صنایع خودرو</a></li>
            <li><a href="http://peyvandha.ir/8-7.htm">حمل و نقل </a></li>
         </ul>
      </div>
   </body>

</html>

 

و می خوهید که: 

تمام لینک ها را از این سورس html استخراج کنید

و یا می خواهید تمام اطلاعاتی که

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