JavaRush /Java блогу /Random-KY /Java тилинде компиляция

Java тилинде компиляция

Группада жарыяланган
IDEде программалоо эң сонун: codeдон көз карандылыктын ырааттуулугу, ыңгайлуу мүчүлүштүктөрдү оңдоо, так тестирлөө, караңгы тема. Ошентип, IDE аркасында өнүгүү секирик жана чектер менен өнүгүп жатат. Бирок ал эс алат. Күн сайын, IDEнин функционалдуулугуна чөмүлүп, иштеп чыгуучу бир баскыч менен иштөөгө же эки чыкылdateу менен курууга көнүп калат. Java тorнде компиляция - 1Буйрук сабында иштөөгө көңүл бурбай, башынан эле IDEде иштеген программалоону жаңы баштагандар менен абал алда канча начар. Мисалы, Intellij IDEAда Java тиркемесинин компиляциясы төмөнкү панелдеги жүктөө тилкеси менен көрсөтүлөт жана компиляциянын бардык параметрлери, класстык жолду иштетүү жана Java жашоосунун башка ырахаттары көшөгө артында калат. IDEсиз Java-да компиляциялоо жөнүндө сөз кылууну сунуштайбыз. Бул макаладагы мисалдарды иштетүү үчүн JDK 1.7 же андан кийинкиси сиздин машинаңызда орнотулганын текшериңиз.

Программаны кантип компиляциялоо керек?

Программалоодо компиляция бул программаны кийинки баштоо үчүн баштапкы codeду bytecodeго кыскартуу. Баштапкы codeдон программаны ишке киргизүүгө чейинки аракеттердин ырааттуулугу төмөнкүдөй болот:
  1. ClassName.java деп аталган файлда баштапкы code бар;
  2. Эгерде codeдо каталар жок болсо, анда ал bytecodeго түзүлөт (ClassName.class файлында);
  3. Программа башталат.
Эреже катары, ар бир программа өзүнчө каталогдо камтылган. Жөнөкөй мисал катары, консолго чыгарууну алалы:
class Test {
   public static void main(String[] args) {
      System.out.println("Это говорит приложение из командной строки");
   }
}

Javac буйругу эмне үчүн колдонулат?

Макул, биринчи пункт жасалды. Түшүнүү үчүн мындан ары карай кетели: кантип компиляциялоо керек? :) Буга javac буйругу жардам берет, анын аргументи талап кылынган файлды көрсөтүшү керек:

javac Test.java
Эгерде codeдо каталар жок болсо, Test.java файлынын жанында Test.class файлы пайда болот. Бул компиляцияланган byte code. Эми аны ишке киргизүү керек. Бул жерде биз byte-codeду иштеткен java буйругун колдонобуз: Java тorнде компиляция - 2Скриншот биз чыгарууда кээ бир иероглифтерди алганыбызды көрсөтүп турат: албетте, бул бузулган codeдоо. Адатта, бул Windows системасында болот. Консолдо кириллица алфавитин туура көрсөтүү үчүн төмөнкү буйруктар бар:

REM change CHCP to UTF-8
CHCP 65001
CLS
Алар учурдагы терезенин узактыгы үчүн учурдагы кабык code барагын өзгөртүшөт. Келгиле, кайра аракет кылалы:

D:\Java>java Test
Бул колдонмо буйрук сабынан эмне дейт. Javac буйругунун кандайча иштээрин билүү абдан пайдалуу, анткени бул буйрук ар кандай долбоорду куруу системасынын негизи болуп саналат.

Бир нече класстарды түзүү жана иштетүү

Бир нече класстар менен иштөө үчүн сизге класс жолу керек. Бул класстар камтылган файл тутумуна окшош жана пакеттер папка катары иштейт. Бул учурда, баштапкы code файлдарын компиляцияланган файлдардан бөлүү жөнүндө ойлонуу керек. Эреже катары, булактар ​​src каталогунда жайгашат, ал эми түзүлгөн класстар бинде болот. Мисалы, бизде класс жана методду камтыган Boxкласс бар . Класс : BoxMachinemainBox
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ар кандай өлчөмдөгү беш класс an objectисин түзөт жана алар жөнүндө маалыматты консолго көрсөтөт. Класстардын бул тобун компиляциялоо үчүн, аргументтери менен негизги каталогдон (src жана bin папкаларын камтыган) javac буйругун колдонушуңуз керек:

javac -d bin ./src/*
-d— желек, андан кийин сиз түзүлгөн класстар бара турган жерди көрсөтүү керек. Бул абдан ыңгайлуу, анткени, мисалы, 1000 классты которуу өтө эмгекти талап кылган процесс. bin— папканын аты. ./src/*— баштапкы файлдардын жайгашкан жери. *бардык файлдарды компиляциялоо керектигин көрсөтөт. Эми компиляцияланган класстар бин папкасында пайда болот. Аларды иштетүү үчүн, ошол эле каталогдон 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— түзүлгөн класстарга же кошумча китепканаларга жол. Эми jar буйругун колдонуп IDEсиз чыныгы программаны курууга убакыт келди:

jar -cmf manifest.mf box-machine.jar  -C bin .
-cmf— желек, андан кийин манифест файлына жолду көрсөтүү керек. manifest.mf— манифестке карай жол. box-machine.jar— чыгаруу jar файлынын аталышы. — желек, андан кийин түзүлгөн класстарга жол көрсөтүлөт. .— jar файлы жайгаштырыла турган жол. Биздин учурда, бул негизги каталог болуп саналат. Эми сиз ишке киргизе аласыз. jar файлдарын ишке киргизүү да java буйругун колдонуу менен ишке ашат, бирок андан кийин желекти көрсөтүшүңүз керек -jar: бул Jar файлы ишке киргизorп жатканын көрсөтүп турат, ал эми экинчи аргумент файлдын жолу 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сиз компиляция: Build системаларына сереп салуу

Буйрук сабын колдонуунун салыштырмалуу жеңилдигине карабастан, аны колдонуу менен орто жана чоң долбоорлорду куруу өтө кыйын. Бул көп убакытты талап кылат жана ар кандай деңгээлдеги каталар менен коштолот. Бактыга жараша, иш процессин бир топ жеңилдеткен монтаждоо системалары бар. Бир нече командалар менен бул система ар кандай татаалдыктагы долбоорду чогулта алат жана мындай системалардын бар учурунда түзүлгөн плагиндердин көптүгү дээрлик бардык баш ооруну жок кыла алат.

Java кантип компиляциялоо керек?

Эң белгилүү Java куруу системалары Ant, Maven жана Gradle болуп саналат. Жакшы да, жаман да жок: алардын ар бири белгилүү бир маселелерди чечүү үчүн түзүлгөн. Келгиле, алардын ар бирин кененирээк карап көрөлү.

Ant

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
Tag <target>жыйынды жана файл тутумун башкарууга мүмкүндүк берген ар кандай тапшырмаларды көрсөтө алат. Кумурсканын 150дөн ашык буйругу бар, алар documentацияда келтирилген. Төмөндөгү мисалда биз 5 гана колдонобуз:
  • mkdir - каталогдорду түзүү
  • delete- файлдарды жана каталогдорду жок кылуу
  • javac- Java codeун түзүү
  • java- компиляцияланган codeду иштетүү
Бул жөнөкөй компиляция, куруу же тазалоо скриптинин көрүнүшү:
<?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 and clean. compileкласстар менен жыйынтык каталогун түзөт, андан кийин түзүлгөн каталогго класстарды компиляциялоо үчүн javac колдонот. runjava буйругу менен түзүлгөн класстарды иштетет. 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

Maven долбоорлорду курууга бир аз башкача мамилени сунуштайт. Бул жерде иштеп чыгуучу, тескерисинче, Анттен айырмаланып, өзүнүн долбоорун жана ал колдонгон кошумча куралдарды сүрөттөйт, мында куруу иш-аракеттердин ырааттуулугу. Maven жөнөкөй көз карандылыкты башкаруу жана бардык өнүктүрүү чөйрөлөрү менен ыңгайлуу интеграциялоосу үчүн иштеп чыгуучулардын арасында популярдуу. Maven менен иштөөдө биз төмөнкү долбоордун структурасын карманабыз: Java тorнде компиляция - 3Куруу эрежелери, көз карандылыктар жана башкалар pom.xml файлында сүрөттөлөт. Эреже катары, ал долбоордун негизги папкасында жайгашкан. Ишке киргенде, Maven файлдын түзүлүшүн жана синтаксисин текшерип, каталар жөнүндө эскертет. Негизги каталогдо, бин жана 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 папкасы бар. pom.xmlде куруу теги түзүүнүн максатын - компиляцияны, баштапкы codeдун каталогдорун жана компиляциянын натыйжа файлдарын, ошондой эле долбоордун атын аныктайт. Maven тесттерди жүргүзүү, Jar файлдарын түзүү, бөлүштүрүүнү куруу жана башка тапшырмалар үчүн ар кандай куруу максаттарына жана плагиндерге ээ.

Gradle

Бул 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'
Файл плагиндерди камтыйт, баштапкы code файлдарынын каталогун (эгерде Maven долбоорунун структурасы колдонулбаса), куруу натыйжаларынын каталогун, негизги класстын аталышын жана демейки тапшырмаларды камтыйт. build.gradle файлы жайгашкан каталогдогу 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сиз codeду компиляциялоо жана чогултуу мүмкүнчүлүгү пайдасыз көрүнөт. Чынында эле, плагиндери бар ыңгайлуу IDE, мүмкүн болгон нерселердин баарын автоматтык түрдө текшерүү (заманбап IDEлер IQ деңгээлин текшербейт) жана популярдуу тутумдар менен интеграция болгондо, буйрук саптары жана Google бардык буйруктары менен эмне үчүн убара болуш керек. Бирок, практика көрсөткөндөй, иштеп чыгуу чөйрөсү жок codeду чогултуу жана бул процесстин ар бир кадамын түшүнүү өтө зарылдык. Бул жөндөм сизге жана сиздин компанияңызга көптөгөн нерв клеткаларын жана убакытты үнөмдөйт. Сиз IDEди кантип колдонууну үйрөнө аласыз, code жазууну машыктырып, жана, албетте, Java программалоонун негиздерин бул жерден - JavaRush сайтынан ала аласыз. Окууга кайтууга убакыт келди :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION