JavaRush /Java blogi /Random-UZ /Java-da kompilyatsiya qilish

Java-da kompilyatsiya qilish

Guruhda nashr etilgan
IDE-da dasturlash juda yaxshi: kodga bog'liqliklarning uyg'unligi, qulay disk raskadrovka, aniq test, qorong'u mavzu. Shunday qilib, IDE tufayli rivojlanish sakrash va chegaralar bilan rivojlanmoqda. Ammo u dam oladi. Har kuni, IDE funksionalligiga sho'ng'igan holda, ishlab chiquvchi bitta tugma bilan ishlashga yoki ikki marta bosish bilan qurishga odatlanib qoladi. Java-da kompilyatsiya qilish - 1Vaziyat boshidanoq IDE-da ishlaydigan va buyruq satridagi ishlarni e'tiborsiz qoldiradigan dasturlash uchun yangi bo'lganlar bilan ancha yomonroq. Misol uchun, Intellij IDEA-da Java ilovasining kompilyatsiyasi pastki paneldagi yuklash paneli orqali namoyish etiladi va barcha kompilyatsiya parametrlari, sinf yo'lini qayta ishlash va Java hayotining boshqa zavqlari sahna ortida qoladi. Java-da IDE-siz kompilyatsiya qilish haqida gapirishni taklif qilamiz. Ushbu maqoladagi misollarni ishga tushirish uchun JDK 1.7 yoki undan keyingi versiyalari kompyuteringizda o'rnatilganligiga ishonch hosil qiling.

Dasturni qanday kompilyatsiya qilish kerak?

Dasturlashda kompilyatsiya - bu dasturni keyingi ishga tushirish uchun dastlabki kodni bayt-kodga qisqartirish. Dastlabki koddan dasturni ishga tushirishgacha bo'lgan harakatlar ketma-ketligi quyidagicha ko'rinadi:
  1. ClassName.java deb nomlangan faylda manba kodi mavjud;
  2. Agar kodda xatolik bo'lmasa, u bayt-kodga kompilyatsiya qilinadi (ClassName.class faylida);
  3. Dastur boshlanadi.
Odatda, har bir dastur alohida katalogda joylashgan. Oddiy misol sifatida, konsolga chiqishni olaylik:
class Test {
   public static void main(String[] args) {
      System.out.println("Это говорит приложение из командной строки");
   }
}

Javac buyrug'i nima uchun ishlatiladi?

OK, birinchi nuqta bajarildi. Keling, tushunish uchun ko'proq boraylik: qanday kompilyatsiya qilish kerak? :) Bunda bizga javac buyrug'i yordam beradi, uning argumenti kerakli faylni ko'rsatishi kerak:

javac Test.java
Agar kodda xatolik bo'lmasa, Test.java fayli yonida Test.class fayli paydo bo'ladi. Bu kompilyatsiya qilingan bayt-kod. Endi uni ishga tushirish kerak. Bu erda biz bayt kodini ishlaydigan java buyrug'idan foydalanamiz: Java da kompilyatsiya qilish - 2Skrinshotda biz chiqishda ba'zi ierogliflarni olishimizni ko'rsatadi: shubhasiz, bu buzilgan kodlash. Odatda bu Windows tizimida sodir bo'ladi. Konsolda kirill alifbosini to'g'ri ko'rsatish uchun quyidagi buyruqlar mavjud:

REM change CHCP to UTF-8
CHCP 65001
CLS
Ular joriy oynaning davomiyligi uchun joriy qobiq kod sahifasini o'zgartiradilar. Yana urinib ko'ramiz:

D:\Java>java Test
Bu dastur buyruq satridan aytadi. Javac buyrug'ining qanday ishlashini bilish juda foydali, chunki bu buyruq har qanday loyiha qurish tizimining asosi hisoblanadi.

Bir nechta sinflarni kompilyatsiya qilish va ishga tushirish

Bir nechta sinflar bilan ishlash uchun sizga sinf yo'li kerak. Bu sinflar mavjud bo'lgan fayl tizimiga o'xshaydi va paketlar papkalar vazifasini bajaradi. Shu nuqtada, dastlabki kod fayllarini kompilyatsiya qilingan fayllardan ajratish haqida o'ylash kerak. Qoida tariqasida, manbalar src katalogida, kompilyatsiya qilingan sinflar esa binda joylashgan. Misol uchun, bizda metodni o'z ichiga olgan sinf Boxva sinf mavjud . Sinf : BoxMachinemainBox
package src;

public class Box {
   private double size;

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

   public String toString() {
       return "Box have size " + size;
   }
}
Bu src paketida, buni tuzatish kerak. Sinf 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));
       }
   }
}
Bu sinf src paketida ham mavjud. Usulda mainu Boxturli o'lchamdagi beshta sinf ob'ektini yaratadi va ular haqidagi ma'lumotlarni konsolga ko'rsatadi. Ushbu sinflar guruhini kompilyatsiya qilish uchun siz argumentlar bilan asosiy katalogdagi (src va bin papkalarini o'z ichiga olgan) javac buyrug'idan foydalanishingiz kerak:

javac -d bin ./src/*
-d— bayroq, shundan so'ng siz tuzilgan sinflar o'tadigan joyni ko'rsatishingiz kerak. Bu juda qulay, chunki, masalan, 1000 ta sinfni o'tkazish juda mehnat talab qiladigan jarayon. bin- papka nomi. ./src/*— manba fayllarning joylashuvi. *barcha fayllar kompilyatsiya qilinishi kerakligini bildiradi. Endi kompilyatsiya qilingan sinflar bin papkasida paydo bo'ladi. Ularni ishga tushirish uchun bir xil katalogdagi java buyrug'idan, shuningdek, argumentlar bilan foydalaning:

java -classpath ./bin BoxMachine
-classpath— bayroq, undan keyin tuzilgan sinflarning joylashuvini ko'rsatish kerak. Java ushbu katalogdagi asosiy sinfni va barcha tegishli sinflarni qidiradi. ./bin— kompilyatsiya qilingan sinflar joylashgan papkaning nomi. BoxMachine— asosiy sinf nomi. Birinchi holatda bo'lgani kabi, ko'rsatilmasligi kerak .class, chunki bu fayl emas, sinf nomi. Xulosa:

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 fayllarini yaratish

Dasturni portlash va ishga tushirishni osonlashtirish uchun siz kompilyatsiya qilingan sinflarni jar fayliga - sinf arxiviga to'plashingiz mumkin. Zip yoki rar arxivlaridan asosiy farqi manifest faylining mavjudligidir. Bu manifest jar fayli bajarilganda ishga tushadigan asosiy sinfni, sinf yo'lini va ko'plab qo'shimcha ma'lumotlarni belgilaydi. Asosiy katalogda manifest.mf faylini yaratamiz. Uning mazmuni quyidagicha bo'ladi:

main-class: src.BoxMachine
class-path: bin/
main-classusulni o'z ichiga olgan mainva ishga tushirilganda bajariladigan sinfni belgilaydi. class-path— kompilyatsiya qilingan sinflar yoki qoʻshimcha kutubxonalarga yoʻl. Endi jar buyrug'i yordamida IDEsiz haqiqiy dasturni yaratish vaqti keldi:

jar -cmf manifest.mf box-machine.jar  -C bin .
-cmf— bayroq, undan so'ng siz manifest fayliga yo'lni ko'rsatishingiz kerak. manifest.mf- manifestga yo'l. box-machine.jar— chiqish jar faylining nomi. — bayroq, undan keyin tuzilgan sinflarga yo'l ko'rsatiladi. .— jar fayli joylashtiriladigan yo'l. Bizning holatda, bu asosiy katalog. Endi siz ishga tushirishingiz mumkin. Jar fayllarini ishga tushirish java buyrug'i yordamida ham amalga oshiriladi, lekin keyin siz bayroqni ko'rsatishingiz kerak -jar: bu Jar fayli ishga tushirilayotganligini bildiradi va ikkinchi argument faylga yo'l jar, jumladan kengaytma :

java -jar box-machine.jar
Xulosa:

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-da IDE-siz kompilyatsiya qilish: Qurilish tizimlariga umumiy nuqtai

Buyruqlar qatoridan foydalanishning nisbatan qulayligiga qaramay, undan foydalangan holda o'rta va yirik loyihalarni qurish juda qiyin. Bu juda ko'p vaqtni oladi va turli darajadagi xatolar bilan to'la. Yaxshiyamki, ish jarayonini ancha osonlashtiradigan montaj tizimlari mavjud. Bir nechta jamoalar bilan ushbu tizim har qanday murakkablikdagi loyihani yig'ishi mumkin va bunday tizimlar mavjud bo'lganda yaratilgan plaginlarning ko'pligi deyarli har qanday bosh og'rig'ini bartaraf etishi mumkin.

Java qanday kompilyatsiya qilinadi?

Eng mashhur Java qurish tizimlari - Ant, Maven va Gradle. Yaxshi yoki yomon yo'q: ularning har biri muayyan muammolarni hal qilish uchun yaratilgan. Keling, ularning har birini batafsil ko'rib chiqaylik.

Chumoli

Ant - bu xml fayli yordamida tasvirlangan skriptdan foydalanadigan qurish vositasi. xml fayl tuzilishi:
<?xml version="1.0"?>
<project name="NameПроекта" default="сценарийПоУмолчанию">
    <target name="NameСценария">
  //  Действия сценария
        <echo>Hello, World!</echo>
    </target>
  //  Второй сценарий
  //  И тд
</project>
Keling, asosiy katalogda quyidagi tarkibga ega build.xml faylini yarataylik:
<?xml version="1.0"?>
<project name="BoxMachine" default="test">
   <target name="test">
       <echo>First build in Ant!</echo>
   </target>
</project>
Xuddi shu katalogda chumoli buyrug'ini chaqiring:

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

test:
     [echo] First build in Ant!

BUILD SUCCESSFUL
Total time: 0 seconds
Teg <target>montaj va fayl tizimini boshqarish imkonini beruvchi turli vazifalarni belgilashi mumkin. Ant-da 150 dan ortiq buyruqlar mavjud bo'lib, ular hujjatlarda keltirilgan. Quyidagi misolda biz faqat 5 tadan foydalanamiz:
  • mkdir - kataloglarni yaratish
  • delete- fayllar va kataloglarni o'chirish
  • javac- Java kodini kompilyatsiya qilish
  • java- kompilyatsiya qilingan kodni ishga tushirish
Oddiy kompilyatsiya, qurish yoki tozalash skripti shunday ko'rinadi:
<?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>
Skript uchta amalni tasvirlaydi - compile, ,code>run va clean. compilesinflar bilan natija katalogini yaratadi, so'ngra yaratilgan katalogga sinflarni kompilyatsiya qilish uchun javac dan foydalanadi. runjava buyrug'i bilan kompilyatsiya qilingan sinflarni ishga tushiradi. cleannatijalar katalogini o'chiradi. Agar asosiy katalogda argumentlarsiz chumoli buyrug'ini bajarsangiz, kompilyatsiya amali bajariladi. Agar muayyan harakatni bajarish kerak bo'lsa, u argumentda ko'rsatiladi.

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

Maven loyihalarni qurishda biroz boshqacha yondashuvni taklif qiladi. Bu erda ishlab chiquvchi Antdan farqli o'laroq, o'z loyihasini va u foydalanadigan qo'shimcha vositalarni tasvirlaydi, bu erda qurilish harakatlar ketma-ketligidir. Maven o'zining oson bog'liqligini boshqarish va barcha ishlab chiqish muhitlari bilan qulay integratsiyalashuvi tufayli ishlab chiquvchilar orasida mashhurdir. Maven bilan ishlashda biz quyidagi loyiha tuzilishiga amal qilamiz: Java da kompilyatsiya qilish - 3Qurilish qoidalari, bog'liqliklar va boshqalar pom.xml faylida tasvirlangan. Odatda u asosiy loyiha papkasida joylashgan. Ishga tushganda, Maven fayl tuzilishi va sintaksisini tekshiradi va sizni xatolar haqida ogohlantiradi. Asosiy katalogda bin va src papkalari yonida pom.xml faylini yarating, ichiga qo'shing:
<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>
Keyin buyruq satrida mvn buyrug'ini ishga tushiring:

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] ------------------------------------------------------------------------
Endi bin papkasida kompilyatsiya qilingan sinflarni o'z ichiga olgan src papkasi mavjud. Pom.xml da qurish yorlig'i qurish maqsadini belgilaydi - kompilyatsiya, manba kodining kataloglari va kompilyatsiya natijalari fayllari, shuningdek, loyiha nomi. Maven-da testlarni bajarish, Jar fayllarini yaratish, tarqatishlarni yaratish va boshqa vazifalar uchun turli xil qurish maqsadlari va plaginlari mavjud.

Gradle

Bu Ant va Mavenga asoslangan eng yosh qurilish tizimi. Asosiy farq shundaki, u vazifalar tartibini aniqlash uchun asiklik grafik asosida ishlaydi. Bu qo'shimcha va ko'p loyihani qurish kabi murakkabroq vazifalar uchun juda foydali. Gradle bilan qurishda, shuningdek, Maven loyihasi papkasi tuzilishiga yopishib olish tavsiya etiladi. Aytgancha, Gradleda qurish fayli build.gradle deb ataladi va Maven faylidan ancha kichikroq ko'rinadi. Sinflarimiz uchun misol:
apply plugin: 'java'
apply plugin: 'application'

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

mainClassName = "src.BoxMachine"

defaultTasks 'compileJava', 'run'
Fayl plaginlarni o'z ichiga oladi, manba kodi fayllari katalogini (agar Maven loyihasi tuzilmasi ishlatilmasa), qurish natijalari katalogini, asosiy sinf nomini va standart vazifalarni belgilaydi. build.gradle fayli joylashgan katalogdagi gradle buyrug'i qurilishni boshlash uchun javobgardir:

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

Xulosa

Bir qarashda IDEsiz kodni kompilyatsiya qilish va yig‘ish imkoniyati foydasizdek tuyuladi. Haqiqatan ham, plaginlar bilan qulay IDE, mumkin bo'lgan hamma narsani avtomatik tekshirish (zamonaviy IDElar IQ darajasini tekshirmaydi) va mashhur tizimlar bilan integratsiya mavjud bo'lganda, nima uchun buyruq satrlari va Google barcha buyruqlar bilan bezovtalanish kerak. Biroq, amaliyot shuni ko'rsatadiki, kodni ishlab chiqish muhitisiz yig'ish va bu jarayonning har bir bosqichini tushunish juda muhim zaruratdir. Bu ko'nikma siz va kompaniyangiz uchun juda ko'p nerv hujayralari va vaqtni tejaydi. Siz IDE-dan qanday foydalanishni o'rganishingiz, kod yozishni mashq qilishingiz va, albatta, Java dasturlash asoslarini shu yerda - JavaRush-da olishingiz mumkin. O'rganishga qaytish vaqti keldi :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION