JavaRush /Java blogi /Random-UZ /Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish
Ve4niY
Daraja

Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish

Guruhda nashr etilgan
Bir vaqtlar reddit.com saytida Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish mavzusida savol berildi: Paket ichidagi Java fayllari guruhini alohida papkaga (keling uni bin deb ataymiz ) kompilyatsiya qiluvchi buyruq bormi? , va yangi sinf fayllarini qanday boshlashim kerak? " Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 1Mavzu muallifi, kylolink , tushuntiradi: "Men Java-dan foydalanishni boshlaganimda, men uchun barcha kompilyatsiya qilish uchun Eclipse-ga tayandim va kod yozishdan xavotirlanardim." Men bu savolni ko'p marta ko'rganman va haqiqatan ham buni. GPS tizimlari va IDE-larni blogga joylashtirishga nima turtki bo'ldi: yaxshimi yoki yomonmi? Men kuchli zamonaviy Java IDE-larni yaxshi ko'raman va ular kundalik hayotimni osonlashtiradi, lekin Java-dan foydalanmasdan oddiy misollar yaratish va ishga tushirishni bilish ham foydalidir. Bu post buni qanday qilish haqida. Java tilini oddiy testlar bilan oʻrganishga bagʻishlangan blogimda men oddiy ilovalarni yozish, yaratish va ishga tushirish uchun baʼzan oddiy matn muharriri va buyruq qatori vositalaridan qanday foydalanishni yoqtirishim haqida yozganman. Mening sevimli Java IDE-larim qancha "qo'shimcha xarajatlar" talab qilishi va ramkadan foydalanish orqali erishilgan imtiyozlar "qo'shimcha xarajatlar" ni oqlash uchun etarlimi yoki yo'qligi haqida erta qaror qabul qilish haqida juda yaxshi fikr. Ko'pgina haqiqiy ilovalarda VL IDE juda qimmatga tushishiga shubha yo'q. Biroq, eng oddiy misol ilovalari uchun bu har doim ham shunday emas. Ushbu postning qolgan qismida ushbu holatlar uchun IDEsiz Java kodini qanday yaratish va ishga tushirish ko'rsatilgan.

Java kodini yozish va bajarish

Misolni aniqroq qilish uchun men kompozitsiya yoki meros orqali bir-biriga bog'langan va dustin.examples deb nomlangan bir xil paketda joylashgan juda oddiy Java sinflaridan foydalanaman . Ikkita sinfda funksiya yetishmayapti ; uchinchi sinf Main.javada IDEsiz sinfni qanday ishga tushirishni ko‘rsatish imkonini beruvchi mainfunksiya mavjud . mainQuyida ushbu uchta sinf uchun kod keltirilgan: Parent.java
package dustin.examples;

public class Parent
{
   @Override
   public String toString()
   {
      return "I'm the Parent.";
   }
}
Child.java
package dustin.examples;

public class Child extends Parent
{
   @Override
   public String toString()
   {
      return "I'm the Child.";
   }
}
Main.java
package dustin.examples;

import static java.lang.System.out;

public class Main
{
   private final Parent parent = new Parent();
   private final Child child = new Child();

   public static void main(final String[] arguments)
   {
      final Main instance = new Main();
      out.println(instance.parent);
      out.println(instance.child);
   }
}
Quyidagi skrinshotda ushbu .java sinflari bilan katalog strukturasi ko‘rsatilgan.Skrinshotda manba fayllar paket nomini ifodalovchi katalog ierarxiyasida joylashganligi ( dustin/misollar , chunki paket ma’lumotlari dustin.examples ) va bu paket katalog ierarxiyasini aks ettiradi. SRC pastki katalogi ostida. Men kompilyatsiya qilingan .class fayllarini joylashtirish uchun sinflar kichik katalogini ham yaratdim (u hozir bo'sh), shuning uchun Javac bu katalog mavjud bo'lmaganda yaratmaydi.

JAVAC bilan qurish va Java bilan ishlash

Java kodini (Ant, Maven, Gradle yoki IDE) yaratish uchun qanday yondashuvdan foydalanmasin, u oxir-oqibat JAVAC-ga tushadi. Oracle/Sun tomonidan taqdim etilgan JAVAC buyruq qatori vositasidagi standart variantlarni JAVAC -help ishga tushirish va qo'shimcha kengaytmalarni JAVAC -help -X ishga tushirish orqali ko'rish mumkin. Ushbu parametrlardan qanday foydalanish haqida batafsil ma'lumotni Windows yoki Unix/Linux uchun JAVAC asbob hujjatlarida topish mumkin. Javac hujjatlarida aytilganidek, -sourcepath opsiyasi manba fayllari mavjud bo'lgan katalogni ifodalash uchun ishlatilishi mumkin. Yuqoridagi skrinshotda ko'rsatilgan katalog tuzilmasida bu shuni anglatadiki, men JAVAC buyrug'ini C:\Java\examples\javacAndJava\ katalogidan ishlayotgan bo'lsam , mening buyrug'imda shunga o'xshash narsa bo'lishi kerak: Javac -sourcepath src SRC\Dastin\misollar\*. Java . Quyidagi skrinshotda buning natijalari ko'rsatilgan. Biz .classJava-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 2 fayllari uchun katalogni belgilamaganimiz sababli , ular sukut bo'yicha ular tuzilgan manba .java fayllari bilan bir xil katalogga joylashtirilgan . Ushbu vaziyatni tuzatish uchun variantdan foydalanishimiz mumkin . Bizning buyruqni hozir ishga tushirish mumkin, masalan, Javac -sourcepath src -d classes src\Dustin\examples\*. Meni seni . Yuqorida aytib o'tilganidek, tanlangan papka (sinflar) allaqachon mavjud bo'lishi kerak. Bu sodir bo'lganda, buyruq quyidagi skrinshotda ko'rsatilganidek, .class fayllarini belgilangan papkaga joylashtiradi. Java buyruq qatori vositasi. Bu oddiygina Java -help yoki Java asboblari sahifalarida berilgan ko'rsatmalarga rioya qilish va (yoki ) varianti bilan .class fayllari joylashuvini belgilash orqali amalga oshiriladi . .class fayllarini qidirish uchun sinflar katalogini belgilash uchun ikkala yondashuvdan foydalanish quyidagi skrinshotda ko'rsatilgan. Oxirgi argument - bajariladigan asosiy funktsiyaga ega bo'lgan sinfning to'liq (butun Java paketi) nomi. Quyidagi skrinshotda ko'rsatilgan buyruqlar java sinflari -cp dustin.examples.Main va java sinflari -classpath dustin.examples.Main. -dJava-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 3-classpath-cpJava-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 4

Chumoli bilan qurish va yugurish

Eng oddiy Java ilovalari uchun, ko'rsatilgandek, mos ravishda dastur yaratish va ishga tushirish uchun JAVAC va Java-dan foydalanish juda oson. Ilovalar biroz murakkablashgani sayin (masalan, bir nechta paketlar/kataloglarda mavjud kod yoki uchinchi tomon kutubxonalari va ramkalariga nisbatan murakkabroq qaramlik sinflari), bu yondashuv noqulay bo'lishi mumkin. Apache Ant "katta uchlik" Java qurish vositalarining eng qadimgisi bo'lib, minglab ilovalar va tarqatishlarda qo'llanilgan. Avvalgi blog postimda aytganimdek, juda oddiy Ant qurish faylini yaratish oson, ayniqsa, agar u men ushbu postda aytib o‘tganimdek shablondan boshlansa. Quyidagi kodlar roʻyxati Chumolining build.xml fayli uchun moʻljallangan boʻlib, undan .java fayllarini .class fayllariga tuzish va keyin yuqorida JAVAC va Java bilan qilinganidek dustin.examples.Main klassini ishga tushirish mumkin. build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="BuildingSansIDE" default="run" basedir=".">
   <description>Building Simple Java Applications Without An IDE</description>

   <target name="compile"
           description="Compile the Java code.">
      <javac srcdir="src"
             destdir="classes"
             debug="true"
      includeantruntime="false" />
   </target>

   <target name="run" depends="compile"
           description="Run the Java application.">
      <java classname="dustin.examples.Main" fork="true">
         <classpath>
           <pathelement path="classes"/>
         </classpath>
      </java>
   </target>
</project>
Men Ant xususiyatlaridan foydalanmadim va ushbu misolni iloji boricha sodda saqlash va JAVAC va Java yordamida oldingi misolga yaqin tutish uchun odatda kiritadigan umumiy maqsadlarni (masalan, "sof" va "Javadoc") o'z ichiga olmadim. . Shuni ham yodda tutingki, men JAVAC Ant topshirig'i uchun "debug" ni "true" ga o'rnatdim, chunki bu Ant ishlamay qolganda to'g'ri emas, lekin JAVAC sukut bo'yicha to'g'ri. Javac vazifasi va Java Ant vazifalari JAVAC buyruq vositalari va Java-ga o'xshashligi ajablanarli emas. Men Ant standart nomini ishlatganim uchun (build.xml) aniq ko'rsatilmagan bo'lsa, quruvchi faylni kutadi va men ushbu tuzilish uchun "Ishga tushirish" maqsadini "standart" sifatida taqdim etganim va "kompilyatsiya" ni bog'liqlik ishga tushirganim uchun kiritganim uchun "Ishga tushirish" maqsadi va Ant mening muhitim yo'lida bo'lganligi sababli, men buyruq satrida qilishim kerak bo'lgan narsa, Ant-ga chumoli misolini build.xml fayli bilan katalogda kompilyatsiya qilish va ishga tushirish edi . Bu quyidagi skrinshotda ko'rsatilgan. Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 5Ant yordamida oddiy Java dasturini kompilyatsiya qilish va ishga tushirishni ko'rsatgan bo'lsam ham, men faqat Ant bilan kompilyatsiya qilaman va Java bilan ishlayman (yoki sinf yo'li og'ir bo'lsa, Java deb ataladigan skript).

Maven bilan qurish va ishlash

Ant Java-ni yaratishning birinchi asosiy vositasi bo'lsa-da, Apache Maven oxir-oqibat konventsiyaga asoslangan konfiguratsiyani qabul qilish va umumiy kutubxona omborlarini qo'llab-quvvatlash tufayli o'z shon-shuhratiga erishdi. Kod va yaratilgan ob'ektlar uning standart katalog tartibiga rioya qilganda Mavendan foydalanish oson. Afsuski, mening misolim ushbu katalog tuzilishiga amal qilmaydi, lekin Maven bizga kutilgan standart katalog tuzilmasini bekor qilishga imkon beradi. Quyidagi roʻyxat manba va maqsadli kataloglar oʻrniga ishlatiladigan Maven POM fayli uchun kod boʻlib, Maven 3.2.1 yordamida Maven tuzilishi uchun boshqa minimal talab qilinadigan elementlarni taqdim etadi. pom.xml
<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>dustin.examples</groupId>
   <artifactId>CompilingAndRunningWithoutIDE</artifactId>
   <version>1</version>

   <build>
      <defaultGoal>compile</defaultGoal>
      <sourceDirectory>src</sourceDirectory>
      <outputDirectory>classes</outputDirectory>
      <finalName>${project.artifactId}-${project.version}</finalName>
   </build>
</project>
Yuqoridagi pom.xml fayli "kompilyatsiya"ning "defaultGoal" ni aniqlaganligi va pom.xml fayllari Maven bajariladigan fayli (MVN) qidiradigan standart POM moslamasi bo'lgani uchun va Maven o'rnatish bin katalogi mening yo'limda bo'lgani uchun, faqat Quyidagi skrinshotda aytib o'tilganidek, .class fayllarini kompilyatsiya qilish uchun "MVN" ni ishga tushirishim kerak. Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 6Men Maven'dan kompilyatsiya qilingan dasturni Mvn Exec buyrug'i yordamida ham ishga tushirishim mumkin: Java -Dexec.mainClass = dustin.examples.Main , bu quyidagi skrinshotda kuzatiladi. Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 7Antda bo'lgani kabi, men o'zimning oddiy Java ilovamni ishga tushirish uchun Maven dan foydalanmayman, balki Java-ni kompilyatsiya qilingan kodda ishlataman (yoki to'g'ridan-to'g'ri Java-ni uzoq sinflarda chaqiradigan skriptdan foydalaning).

Gradle bilan qurish va ishlash

Gradle uchta asosiy Java qurish vositalaridan eng yangi, eng zamonaviy va zamonaviy hisoblanadi. Men ba'zan modaning mohiyatiga shubha bilan qarayman, lekin Gradle haqida juda ko'p narsalarni topdim (XML o'rniga Groovy-da yozilgan, o'rnatilgan Ant-ni qo'llab-quvvatlash, o'rnatilgan Ivy-ni qo'llab-quvvatlash, konventsiya bo'yicha sozlash oson. qayta sozlash uchun, Maven omborini qo'llab-quvvatlash va boshqalar). Quyidagi misolda oddiy dasturni kompilyatsiya qilish va ishga tushirish uchun ishlatilishi mumkin bo'lgan Gradle tuzilishi ko'rsatilgan, bu post uchun asosiy namuna kodi. Men ushbu moslashtirilgan misolni Simple Gradle Java Plugin Customization blogida taqdim etdim. build.gradle
apply plugin: 'java'
apply plugin: 'application'

// Redefine where Gradle should expect Java source files (*.java)
sourceSets {
    main {
        java {
            srcDirs 'src'
        }
    }
}

// Redefine where .class files are written
sourceSets.main.output.classesDir = file("classes")

// Specify main class to be executed
mainClassName = "dustin.examples.Main"

defaultTasks 'compileJava', 'run'
build.gradle faylidagi dastlabki ikkita satr Java plaginidan va Ilova plaginidan foydalanishni bildiradi, natijada ushbu tuzilishga avtomatik ravishda bir qator funksiyalar kiritiladi. "sourceSets" va "sourceSets.main.output.classesDir" ni belgilash sizga mos ravishda Java manba kodi va kompilyatsiya qilingan ikkilik sinflar uchun Gradle plaginining standart Java kataloglarini bekor qilish imkonini beradi. "MainClassName" sizga qaysi sinfni ishga tushirish kerakligini aniq belgilash imkonini beradi. Ilova plagini. “defaultTasks” qatori buyruq satrida oddiygina “Gradle” ni kiritish orqali bajariladigan vazifalarni belgilaydi: “compileJava” Java plagini tomonidan taqdim etilgan standart vazifa va “Ishga tushirish” ilova plagini tomonidan taqdim etilgan standart vazifadir. Assambleyalarni build.gradle deb nomlaganim va shuning uchun men standart vazifalarni "compileJava" va "Run" deb belgilaganman va mening yo'limda Gradle o'rnatish bin katalogi borligi sababli, misollarni yaratish va ishga tushirish uchun faqat yozish kerak edi. "Gradle" va bu quyidagi skrinshotda ko'rsatilgan. Java-ni IDEsiz kompilyatsiya qilish va ishga tushirish - 8Hatto eng katta skeptik ham Gradle qurilishi ushbu oddiy misol uchun juda silliq ekanligini tan olishi kerak. U ma'lum konventsiyalar va taxminlarga tayanishning ixchamligini, kerak bo'lganda defoltlarni bekor qilish uchun juda oson mexanizm bilan birlashtiradi. XML o'rniga Groovy-da ekanligi ham juda jozibali! Ant va Maven bilan bo'lgani kabi, men faqat shu vositalar yordamida tuzaman va kompilyatsiya qilingan .class fayllarini to'g'ridan-to'g'ri Java'dan yoki Java chaqiruvchi skriptdan ishga tushirishga moyilman. Aytgancha, men ushbu .sinflarni ishga tushirish uchun kavanozga ham arxivlashga moyilman, ammo bu maqolaning doirasidan tashqarida.

Xulosa

IDE ko'pincha oddiy ilovalar va misollar yaratish uchun kerak emas va oddiy misollar yaratish uchun sarflanganidan ham qimmatroq bo'lishi mumkin. Bunday holda, misollarni to'g'ridan-to'g'ri qurish va ishga tushirish uchun JAVAC va Java-dan foydalanish juda oson. Ko'proq ishtirok etishga misol sifatida, Ant, Maven yoki Gradle kabi qurish vositasi yanada jozibali bo'ladi. Ko'pgina ishlab chiqish muhitlari ushbu qurilish yordamchi dasturlarini qo'llab-quvvatlashi shuni anglatadiki, agar oddiy dastur to'liq huquqli loyihaga aylanganda IDE qo'llab-quvvatlash zarurligi aniqlansa, ishlab chiquvchi jarayonda avval yaratilgan o'rnatilgan vosita yordamida IDE-ga o'tishi mumkin. .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION