JavaRush /وبلاگ جاوا /Random-FA /کامپایل در جاوا

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

در گروه منتشر شد
برنامه نویسی در یک IDE عالی است: انسجام وابستگی های کد، اشکال زدایی راحت، آزمایش واضح، تم تیره. بنابراین، به لطف IDE، توسعه با جهش و مرز در حال توسعه است. اما او آرام می شود. هر روز، با غوطه ور شدن در عملکرد IDE، توسعه دهنده عادت می کند با یک دکمه یا ساختمان با دو کلیک متعهد شود. کامپایل در جاوا - 1وضعیت با کسانی که تازه برنامه نویسی می کنند و از همان ابتدا در IDE کار می کنند و کار روی خط فرمان را نادیده می گیرند، بسیار بدتر است. به عنوان مثال، در Intellij IDEA، کامپایل یک برنامه جاوا با یک نوار بارگذاری در پانل پایین نشان داده می شود و تمام پارامترهای کامپایل، پردازش مسیر کلاس و دیگر لذت های زندگی جاوا در پشت صحنه باقی می مانند. پیشنهاد می کنیم در مورد کامپایل در جاوا بدون IDE صحبت کنید. برای اجرای مثال های این مقاله، مطمئن شوید که JDK 1.7 یا بالاتر روی دستگاه شما نصب شده است.

چگونه یک برنامه را کامپایل کنیم؟

کامپایل در برنامه نویسی کاهش کد منبع به بایت کد برای شروع بعدی برنامه است. دنباله اقدامات از کد منبع تا راه اندازی برنامه به صورت زیر است:
  1. کد منبع در فایلی به نام ClassName.java وجود دارد.
  2. اگر هیچ خطایی در کد وجود نداشته باشد، به کد بایت (در فایل ClassName.class) کامپایل می شود.
  3. برنامه شروع می شود.
به طور معمول، هر برنامه در یک فهرست جداگانه قرار دارد. به عنوان یک مثال ساده، اجازه دهید خروجی را به کنسول ببریم:
class Test {
   public static void main(String[] args) {
      System.out.println("Это говорит приложение из командной строки");
   }
}

دستور javac برای چیست؟

بسیار خوب، نکته اول تمام شد. بیایید بیشتر برویم تا بفهمیم: چگونه کامپایل کنیم؟ :) دستور javac در این امر به ما کمک می کند که آرگومان آن باید فایل مورد نیاز را مشخص کند:

javac Test.java
اگر هیچ خطایی در کد وجود نداشته باشد، یک فایل Test.class در کنار فایل Test.java ظاهر می شود. این بایت کد کامپایل شده است. اکنون باید راه اندازی شود. در اینجا از دستور جاوا استفاده می کنیم که بایت کد را اجرا می کند: کامپایل در جاوا - 2تصویر صفحه نشان می دهد که در خروجی تعدادی هیروگلیف دریافت می کنیم: بدیهی است که این یک رمزگذاری شکسته است. به طور معمول این اتفاق در یک سیستم ویندوز می افتد. برای نمایش صحیح الفبای سیریلیک در کنسول، دستورات زیر وجود دارد:

REM change CHCP to UTF-8
CHCP 65001
CLS
آنها صفحه کد پوسته فعلی را برای مدت زمان پنجره فعلی تغییر می دهند. بیایید دوباره تلاش کنیم:

D:\Java>java Test
این چیزی است که برنامه از خط فرمان می گوید. دانستن نحوه عملکرد دستور javac بسیار مفید است، زیرا این دستور اساس هر سیستم ساخت پروژه است.

کامپایل و اجرای چندین کلاس

برای کار با چندین کلاس به یک classpath نیاز دارید. این شبیه به یک سیستم فایل است که در آن کلاس ها قرار دارند و بسته ها به عنوان پوشه عمل می کنند. در این مرحله، ارزش آن را دارد که فایل های کد منبع را از فایل های کامپایل شده جدا کنیم. به عنوان یک قاعده، منابع در دایرکتوری src قرار دارند و کلاس های کامپایل شده در bin قرار دارند. به عنوان مثال، ما یک کلاس Boxو یک کلاس داریم BoxMachineکه حاوی یک متد است main. کلاس Box:
package src;

public class Box {
   private double size;

   public Box(double size) {
       this.size = size;
   }

   public String toString() {
       return "Box have size " + size;
   }
}
در پکیج src هست، باید اصلاح شود. کلاس BoxMachine:
package src;

public class BoxMachine {
   public static void main(String[] args) {
       for(int  i = 0; i < 5; i++) {
           System.out.println(new Box(Math.random()*10));
       }
   }
}
این کلاس در بسته src نیز یافت می شود. در متد main، پنج شیء کلاس با اندازه های مختلف ایجاد می کند Boxو اطلاعات مربوط به آنها را به کنسول نمایش می دهد. برای کامپایل این گروه از کلاس ها، باید از دستور javac از دایرکتوری اصلی (که شامل پوشه های src و bin است) با آرگومان ها استفاده کنید:

javac -d bin ./src/*
-d- یک پرچم که پس از آن باید مکانی را که کلاس های کامپایل شده در آنجا خواهند رفت را مشخص کنید. این بسیار راحت است، زیرا انتقال، به عنوان مثال، 1000 کلاس یک فرآیند بسیار کار فشرده است. bin- نام پوشه. ./src/*- محل فایل های منبع *نشان می دهد که تمام فایل ها باید کامپایل شوند. اکنون کلاس های کامپایل شده در پوشه bin ظاهر می شوند. برای اجرای آنها، از دستور جاوا از همان دایرکتوری، همچنین با آرگومان استفاده کنید:

java -classpath ./bin BoxMachine
-classpath- یک پرچم که پس از آن باید مکان کلاس های کامپایل شده را مشخص کنید. جاوا در این دایرکتوری به دنبال کلاس اصلی و تمام کلاس های مرتبط می گردد. ./bin- نام پوشه ای که کلاس های کامپایل شده در آن قرار دارند. BoxMachine- نام کلاس اصلی مانند مورد اول، نباید مشخص شود .class، زیرا این نام یک کلاس است، نه یک فایل. نتیجه:

D:\Java>java -classpath ./bin src.BoxMachine
Box have size 4.085985295359718
Box have size 8.63682158248986
Box have size 6.027448124299726
Box have size 7.288317703877914
Box have size 1.106181659384694

ایجاد فایل های JAR

برای اینکه برنامه پورت و اجرا شود، می توانید کلاس های کامپایل شده را در یک فایل jar - یک بایگانی کلاس جمع آوری کنید. تفاوت اصلی با آرشیوهای zip یا rar وجود یک فایل مانیفست است. این مانیفست کلاس اصلی را که هنگام اجرای فایل jar اجرا می شود، مسیر کلاس و اطلاعات اضافی زیادی را مشخص می کند. بیایید یک فایل manifest.mf در دایرکتوری اصلی ایجاد کنیم. مطالب آن به شرح زیر خواهد بود:

main-class: src.BoxMachine
class-path: bin/
main-classکلاسی را که حاوی متد است mainو در هنگام راه اندازی اجرا می شود را مشخص می کند. class-path- مسیر کلاس های کامپایل شده یا کتابخانه های اضافی. اکنون زمان ساخت یک برنامه واقعی بدون IDE با استفاده از دستور jar است:

jar -cmf manifest.mf box-machine.jar  -C bin .
-cmf- یک پرچم که پس از آن باید مسیر فایل مانیفست را مشخص کنید. manifest.mf- مسیر به مانیفست. box-machine.jar- نام فایل jar خروجی. - یک پرچم که پس از آن مسیر کلاس های کامپایل شده نشان داده می شود. .- مسیری که فایل jar در آن قرار خواهد گرفت. در مورد ما، این دایرکتوری اصلی است. اکنون می توانید راه اندازی کنید. راه‌اندازی فایل‌های jar نیز با استفاده از دستور java انجام می‌شود، اما پس از آن باید پرچم را مشخص کنید -jar: نشان می‌دهد که فایل Jar در حال راه‌اندازی است و آرگومان دوم مسیر jarفایل است، از جمله پسوند :

java -jar box-machine.jar
نتیجه:

Box have size 5.5495235762547965
Box have size 9.695870044165662
Box have size 2.3408385788129227
Box have size 7.2790741216674135
Box have size 2.3620854470160513

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

با وجود سهولت نسبی استفاده از خط فرمان، ساخت پروژه های متوسط ​​و بزرگ با استفاده از آن بسیار دشوار است. این کار زمان زیادی می برد و مملو از خطاهای درجات مختلف است. خوشبختانه، سیستم های مونتاژی وجود دارد که روند کار را بسیار آسان می کند. این سیستم با چندین تیم می تواند پروژه ای با هر پیچیدگی را جمع آوری کند و وفور افزونه های ایجاد شده در طول وجود چنین سیستم هایی می تواند تقریباً هر سردردی را از بین ببرد.

چگونه جاوا را کامپایل کنیم؟

معروف ترین سیستم های ساخت جاوا Ant، ​​Maven و Gradle هستند. هیچ خوب یا بدی وجود ندارد: هر یک از آنها برای حل مشکلات خاصی ایجاد شده اند. بیایید به هر یک از آنها با جزئیات بیشتری نگاه کنیم.

مورچه

Ant یک ابزار ساخت است که از یک اسکریپت توصیف شده با استفاده از یک فایل xml استفاده می کند. ساختار فایل xml:
<?xml version="1.0"?>
<project name="NameПроекта" default="сценарийПоУмолчанию">
    <target name="NameСценария">
  //  Действия сценария
        <echo>Hello, World!</echo>
    </target>
  //  Второй сценарий
  //  И тд
</project>
بیایید یک فایل build.xml در دایرکتوری اصلی با محتویات زیر ایجاد کنیم:
<?xml version="1.0"?>
<project name="BoxMachine" default="test">
   <target name="test">
       <echo>First build in Ant!</echo>
   </target>
</project>
در همان دایرکتوری، دستور ant را فراخوانی کنید:

D:\Java>D:\Temp\ant\bin\ant
Buildfile: D:\Java\build.xml

test:
     [echo] First build in Ant!

BUILD SUCCESSFUL
Total time: 0 seconds
تگ <target>می تواند وظایف مختلفی را مشخص کند که به شما امکان می دهد سیستم اسمبلی و فایل را مدیریت کنید. مورچه بیش از 150 فرمان در دسترس دارد که در اسناد ذکر شده است. در مثال زیر فقط از 5 استفاده می کنیم:
  • mkdir - ایجاد دایرکتوری ها
  • delete- حذف فایل ها و دایرکتوری ها
  • javac- تدوین کد جاوا
  • java- اجرای کدهای کامپایل شده
این چیزی است که یک اسکریپت کامپایل، ساخت یا پاکسازی ساده به نظر می رسد:
<?xml version="1.0"?>
<project name="BoxMachine" default="compile">
   <target name="compile">
       <mkdir dir="result/classes"/>
       <javac destdir="result/classes" includeantruntime="false">
           <src path="src"/>
       </javac>
   </target>
   <target name="run" depends="compile">
       <java classname="BoxMachine" classpath="result/classes"/>
   </target>
   <target name="clean">
       <delete dir="result"/>
   </target>
</project>
اسکریپت سه عمل را شرح می دهد - compile, ,code>run و clean. compileیک دایرکتوری نتیجه با کلاس هایی در آن ایجاد می کند، سپس از javac برای کامپایل کلاس ها در پوشه ایجاد شده استفاده می کند. runکلاس های کامپایل شده را با دستور جاوا اجرا می کند. cleanفهرست نتایج را حذف می کند. اگر دستور ant را در دایرکتوری اصلی بدون هیچ آرگومان اجرا کنید، عمل کامپایل اجرا خواهد شد. اگر عمل خاصی باید انجام شود، در آرگومان مشخص می شود.

D:\Java>D:/Temp/ant/bin/ant compile
Buildfile: D:\Java\build.xml

compile:
    [mkdir] Created dir: D:\Java\result\classes
    [javac] Compiling 2 source files to D:\Java\result\classes

BUILD SUCCESSFUL
Total time: 1 second

ماون

Maven رویکرد کمی متفاوت برای پروژه های ساختمانی ارائه می دهد. در اینجا، توسعه‌دهنده پروژه خود و ابزارهای اضافی را که از آن استفاده می‌کند، توضیح می‌دهد، برخلاف Ant، ​​که در آن بیلد دنباله‌ای از اقدامات است. Maven به دلیل مدیریت وابستگی آسان و ادغام راحت با همه محیط های توسعه در بین توسعه دهندگان محبوب است. هنگام کار با Maven، ما به ساختار پروژه زیر پایبند هستیم: کامپایل در جاوا - 3قوانین ساخت، وابستگی ها و غیره در فایل pom.xml توضیح داده شده است. معمولاً در پوشه اصلی پروژه قرار دارد. هنگام راه اندازی، Maven ساختار فایل و نحو را بررسی می کند و به شما در مورد خطاها هشدار می دهد. در پوشه اصلی، در کنار پوشه bin و src، یک فایل pom.xml ایجاد کنید، داخل آن اضافه کنید:
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>ru.javarush.testmaven</groupId>
  <artifactId>testMavenWithoutIde</artifactId>
  <version>1.0.0</version>

  <build>
     <defaultGoal>compile</defaultGoal>
     <sourceDirectory>src</sourceDirectory>
     <outputDirectory>bin</outputDirectory>
     <finalName>${project.artifactId}-${project.version}</finalName>
  </build>
</project>
سپس دستور mvn را در خط فرمان اجرا کنید:

D:\Java>mvn
[INFO] Scanning for projects...
[INFO]
[INFO] -------------< ru.javarush.testmaven:testMavenWithoutIde >--------------
[INFO] Building testMavenWithoutIde 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ testMavenWithoutIde ---
[WARNING] Using platform encoding (Cp1251 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\Java\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ testMavenWithoutIde ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1251, i.e. build is platform dependent!
[INFO] Compiling 2 source files to D:\Java\bin
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.521 s
[INFO] Finished at: 2019-06-25T20:18:05+03:00
[INFO] ------------------------------------------------------------------------
اکنون یک پوشه src در پوشه bin وجود دارد که شامل کلاس های کامپایل شده است. در pom.xml، تگ build هدف ساخت - کامپایل، دایرکتوری های کد منبع و فایل های نتیجه کامپایل و همچنین نام پروژه را مشخص می کند. Maven دارای انواع هدف های ساخت و پلاگین برای اجرای آزمایش ها، ایجاد فایل های Jar، ساخت توزیع ها و سایر وظایف است.

گریدل

این جوانترین سیستم ساخت است که بر اساس Ant و Maven ساخته شده است. تفاوت اصلی این است که بر اساس یک نمودار غیر چرخه ای برای تعیین ترتیب وظایف کار می کند. این برای کارهای پیچیده تر، مانند ساخت های افزایشی و چند پروژه ای بسیار مفید است. هنگام ساخت با Gradle، همچنین توصیه می شود به ساختار پوشه پروژه Maven پایبند باشید. ضمناً فایل ساخت در Gradle build.gradle نام دارد و بسیار کوچکتر از Maven به نظر می رسد. مثال برای کلاس های ما:
apply plugin: 'java'
apply plugin: 'application'

sourceSets {
   main {
       java {
           srcDirs 'src'
       }
   }
}
sourceSets.main.output.classesDir = file("bin")

mainClassName = "src.BoxMachine"

defaultTasks 'compileJava', 'run'
این فایل شامل افزونه‌ها، فهرست راهنمای فایل‌های کد منبع (در صورت عدم استفاده از ساختار پروژه Maven)، فهرست نتایج ساخت، نام کلاس اصلی و وظایف پیش‌فرض است. دستور gradle در دایرکتوری که فایل build.gradle در آن قرار دارد، مسئول شروع ساخت است:

d:\Java>D:\Temp\gradle\bin\gradle

Welcome to Gradle 5.4.1!

Here are the highlights of this release:
 - Run builds with JDK12
 - New API for Incremental Tasks
 - Updates to native projects, including Swift 5 support

For more details see https://docs.gradle.org/5.4.1/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

> Task :help

Welcome to Gradle 5.4.1.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

For troubleshooting, visit https://help.gradle.org

BUILD SUCCESSFUL in 52s
1 actionable task: 1 executed

نتیجه

در نگاه اول، توانایی کامپایل و مونتاژ کد بدون IDE بی فایده به نظر می رسد. در واقع، وقتی یک IDE دنج با پلاگین ها، بررسی خودکار همه چیز ممکن است (IDE های مدرن سطح IQ را بررسی نمی کنند) و ادغام با سیستم های محبوب، چرا با خطوط فرمان و گوگل تمام دستورات را خسته کنید. با این حال، تمرین نشان می‌دهد که توانایی جمع‌آوری کد بدون محیط توسعه و درک هر مرحله از این فرآیند یک ضرورت جدی است. این مهارت سلول های عصبی و زمان زیادی را برای شما و شرکتتان ذخیره می کند. می‌توانید نحوه استفاده از IDE، تمرین کدنویسی و البته اصول برنامه‌نویسی جاوا را در اینجا در JavaRush بیاموزید. زمان بازگشت به یادگیری :)
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION