JavaRush /مدونة جافا /Random-AR /تجميع في جافا

تجميع في جافا

نشرت في المجموعة
تعد البرمجة في IDE أمرًا رائعًا: تماسك تبعيات التعليمات البرمجية، وتصحيح الأخطاء المريح، والاختبار الواضح، والموضوع المظلم. لذلك، بفضل IDE، يتطور التطوير على قدم وساق. لكنها ترتاح. كل يوم، من خلال الانغماس في وظائف IDE، يعتاد المطور على الالتزام بزر واحد أو البناء بنقرتين. التجميع في جافا - 1الوضع أسوأ بكثير مع أولئك الجدد في البرمجة الذين يعملون في IDE منذ البداية، متجاهلين العمل في سطر الأوامر. على سبيل المثال، في Intellij IDEA، يتم عرض تجميع تطبيق Java من خلال شريط تحميل في اللوحة السفلية، وتبقى جميع معلمات التجميع ومعالجة مسار الفئة وغيرها من روائع حياة Java خلف الكواليس. نقترح التحدث عن التجميع في Java بدون 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. هذا هو الرمز الثانوي المترجم. الآن يجب إطلاقه. نستخدم هنا أمر java، الذي يقوم بتشغيل الكود الثانوي: التجميع في جافا - 2توضح لقطة الشاشة أننا حصلنا على بعض الحروف الهيروغليفية في الإخراج: من الواضح أن هذا تشفير معطل. عادةً ما يحدث هذا على نظام 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، نلتزم ببنية المشروع التالية: التجميع في جافا - 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، تحدد علامة البناء الغرض من البناء - التجميع، وأدلة التعليمات البرمجية المصدر وملفات نتائج التجميع، بالإضافة إلى اسم المشروع. يمتلك 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 عديمة الفائدة. في الواقع، لماذا تهتم بأسطر الأوامر وGoogle جميع الأوامر عندما يكون هناك بيئة تطوير متكاملة (IDE) مريحة مع المكونات الإضافية، والتحقق التلقائي من كل شيء ممكن (لا تتحقق بيئة التطوير المتكاملة الحديثة من مستوى الذكاء) والتكامل مع الأنظمة الشائعة. ومع ذلك، تظهر الممارسة أن القدرة على تجميع التعليمات البرمجية دون بيئة تطوير وفهم كل خطوة من هذه العملية أمر ضروري للغاية. ستوفر هذه المهارة الكثير من الخلايا العصبية والوقت لك ولشركتك. يمكنك تعلم كيفية استخدام IDE، والتدرب على كتابة التعليمات البرمجية، وبالطبع الحصول على أساسيات برمجة Java هنا - في JavaRush. حان وقت العودة للتعلم :)
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION