برنامه نویسی در یک IDE عالی است: انسجام وابستگی های کد، اشکال زدایی راحت، آزمایش واضح، تم تیره. بنابراین، به لطف IDE، توسعه با جهش و مرز در حال توسعه است. اما او آرام می شود. هر روز، با غوطه ور شدن در عملکرد IDE، توسعه دهنده عادت می کند با یک دکمه یا ساختمان با دو کلیک متعهد شود. وضعیت با کسانی که تازه برنامه نویسی می کنند و از همان ابتدا در IDE کار می کنند و کار روی خط فرمان را نادیده می گیرند، بسیار بدتر است. به عنوان مثال، در Intellij IDEA، کامپایل یک برنامه جاوا با یک نوار بارگذاری در پانل پایین نشان داده می شود و تمام پارامترهای کامپایل، پردازش مسیر کلاس و دیگر لذت های زندگی جاوا در پشت صحنه باقی می مانند. پیشنهاد می کنیم در مورد کامپایل در جاوا بدون IDE صحبت کنید. برای اجرای مثال های این مقاله، مطمئن شوید که JDK 1.7 یا بالاتر روی دستگاه شما نصب شده است.
چگونه یک برنامه را کامپایل کنیم؟
کامپایل در برنامه نویسی کاهش کد منبع به بایت کد برای شروع بعدی برنامه است. دنباله اقدامات از کد منبع تا راه اندازی برنامه به صورت زیر است:- کد منبع در فایلی به نام ClassName.java وجود دارد.
- اگر هیچ خطایی در کد وجود نداشته باشد، به کد بایت (در فایل ClassName.class) کامپایل می شود.
- برنامه شروع می شود.
class Test {
public static void main(String[] args) {
System.out.println("Это говорит приложение из командной строки");
}
}
دستور javac برای چیست؟
بسیار خوب، نکته اول تمام شد. بیایید بیشتر برویم تا بفهمیم: چگونه کامپایل کنیم؟ :) دستور javac در این امر به ما کمک می کند که آرگومان آن باید فایل مورد نیاز را مشخص کند:
javac Test.java
اگر هیچ خطایی در کد وجود نداشته باشد، یک فایل Test.class در کنار فایل Test.java ظاهر می شود. این بایت کد کامپایل شده است. اکنون باید راه اندازی شود. در اینجا از دستور جاوا استفاده می کنیم که بایت کد را اجرا می کند: تصویر صفحه نشان می دهد که در خروجی تعدادی هیروگلیف دریافت می کنیم: بدیهی است که این یک رمزگذاری شکسته است. به طور معمول این اتفاق در یک سیستم ویندوز می افتد. برای نمایش صحیح الفبای سیریلیک در کنسول، دستورات زیر وجود دارد:
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، ما به ساختار پروژه زیر پایبند هستیم: قوانین ساخت، وابستگی ها و غیره در فایل 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
GO TO FULL VERSION