تعد البرمجة في IDE أمرًا رائعًا: تماسك تبعيات التعليمات البرمجية، وتصحيح الأخطاء المريح، والاختبار الواضح، والموضوع المظلم. لذلك، بفضل IDE، يتطور التطوير على قدم وساق. لكنها ترتاح. كل يوم، من خلال الانغماس في وظائف IDE، يعتاد المطور على الالتزام بزر واحد أو البناء بنقرتين. الوضع أسوأ بكثير مع أولئك الجدد في البرمجة الذين يعملون في IDE منذ البداية، متجاهلين العمل في سطر الأوامر. على سبيل المثال، في Intellij IDEA، يتم عرض تجميع تطبيق Java من خلال شريط تحميل في اللوحة السفلية، وتبقى جميع معلمات التجميع ومعالجة مسار الفئة وغيرها من روائع حياة Java خلف الكواليس. نقترح التحدث عن التجميع في Java بدون 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. هذا هو الرمز الثانوي المترجم. الآن يجب إطلاقه. نستخدم هنا أمر java، الذي يقوم بتشغيل الكود الثانوي: توضح لقطة الشاشة أننا حصلنا على بعض الحروف الهيروغليفية في الإخراج: من الواضح أن هذا تشفير معطل. عادةً ما يحدث هذا على نظام Windows. لعرض الأبجدية السيريلية بشكل صحيح في وحدة التحكم، هناك الأوامر التالية:
REM change CHCP to UTF-8
CHCP 65001
CLS
يقومون بتغيير صفحة رموز Shell الحالية طوال مدة النافذة الحالية. لنجرب مجددا:
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 من نفس الدليل، مع الوسائط أيضًا:
java -classpath ./bin BoxMachine
-classpath
- علامة يجب عليك بعدها الإشارة إلى موقع الفئات المترجمة. ستبحث Java عن الفئة الرئيسية وجميع الفئات ذات الصلة في هذا الدليل. ./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 أيضًا باستخدام أمر 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
التجميع في Java بدون IDE: نظرة عامة على أنظمة البناء
على الرغم من السهولة النسبية لاستخدام سطر الأوامر، إلا أنه من الصعب جدًا إنشاء مشاريع متوسطة وكبيرة باستخدامه. يستغرق هذا الكثير من الوقت ومحفوفًا بأخطاء بدرجات متفاوتة. لحسن الحظ، هناك أنظمة التجميع التي تجعل عملية العمل أسهل بكثير. مع العديد من الفرق، يمكن لهذا النظام تجميع مشروع بأي تعقيد، كما أن وفرة المكونات الإضافية التي تم إنشاؤها أثناء وجود مثل هذه الأنظمة يمكن أن تقضي على أي صداع تقريبًا.كيفية تجميع جافا؟
أشهر أنظمة بناء Java هي 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>
في نفس الدليل، قم باستدعاء أمر النمل:
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>
تحديد المهام المختلفة التي تسمح لك بإدارة نظام التجميع والملفات. لدى Ant أكثر من 150 أمرًا متاحًا، وهي مدرجة في الوثائق. في المثال أدناه نستخدم 5 فقط:
مكدير - إنشاء الدلائل 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
يقوم بتشغيل الفئات المترجمة باستخدام أمر Java. 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، تحدد علامة البناء الغرض من البناء - التجميع، وأدلة التعليمات البرمجية المصدر وملفات نتائج التجميع، بالإضافة إلى اسم المشروع. يمتلك 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