IDEде программалоо эң сонун: codeдон көз карандылыктын ырааттуулугу, ыңгайлуу мүчүлүштүктөрдү оңдоо, так тестирлөө, караңгы тема. Ошентип, IDE аркасында өнүгүү секирик жана чектер менен өнүгүп жатат. Бирок ал эс алат. Күн сайын, IDEнин функционалдуулугуна чөмүлүп, иштеп чыгуучу бир баскыч менен иштөөгө же эки чыкылdateу менен курууга көнүп калат. Буйрук сабында иштөөгө көңүл бурбай, башынан эле IDEде иштеген программалоону жаңы баштагандар менен абал алда канча начар. Мисалы, Intellij IDEAда Java тиркемесинин компиляциясы төмөнкү панелдеги жүктөө тилкеси менен көрсөтүлөт жана компиляциянын бардык параметрлери, класстык жолду иштетүү жана Java жашоосунун башка ырахаттары көшөгө артында калат. IDEсиз Java-да компиляциялоо жөнүндө сөз кылууну сунуштайбыз. Бул макаладагы мисалдарды иштетүү үчүн JDK 1.7 же андан кийинкиси сиздин машинаңызда орнотулганын текшериңиз.
Программаны кантип компиляциялоо керек?
Программалоодо компиляция бул программаны кийинки баштоо үчүн баштапкы codeду bytecodeго кыскартуу. Баштапкы codeдон программаны ишке киргизүүгө чейинки аракеттердин ырааттуулугу төмөнкүдөй болот:- ClassName.java деп аталган файлда баштапкы code бар;
- Эгерде codeдо каталар жок болсо, анда ал bytecodeго түзүлөт (ClassName.class файлында);
- Программа башталат.
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 буйругун колдонобуз: Скриншот биз чыгарууда кээ бир иероглифтерди алганыбызды көрсөтүп турат: албетте, бул бузулган codeдоо. Адатта, бул Windows системасында болот. Консолдо кириллица алфавитин туура көрсөтүү үчүн төмөнкү буйруктар бар:
REM change CHCP to UTF-8
CHCP 65001
CLS
Алар учурдагы терезенин узактыгы үчүн учурдагы кабык code барагын өзгөртүшөт. Келгиле, кайра аракет кылалы:
D:\Java>java Test
Бул колдонмо буйрук сабынан эмне дейт. Javac буйругунун кандайча иштээрин билүү абдан пайдалуу, анткени бул буйрук ар кандай долбоорду куруу системасынын негизи болуп саналат.
Бир нече класстарды түзүү жана иштетүү
Бир нече класстар менен иштөө үчүн сизге класс жолу керек. Бул класстар камтылган файл тутумуна окшош жана пакеттер папка катары иштейт. Бул учурда, баштапкы code файлдарын компиляцияланган файлдардан бөлүү жөнүндө ойлонуу керек. Эреже катары, булактар src каталогунда жайгашат, ал эми түзүлгөн класстар бинде болот. Мисалы, бизде класс жана методду камтыган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
ар кандай өлчөмдөгү беш класс 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 колдонот. 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
Maven долбоорлорду курууга бир аз башкача мамилени сунуштайт. Бул жерде иштеп чыгуучу, тескерисинче, Анттен айырмаланып, өзүнүн долбоорун жана ал колдонгон кошумча куралдарды сүрөттөйт, мында куруу иш-аракеттердин ырааттуулугу. Maven жөнөкөй көз карандылыкты башкаруу жана бардык өнүктүрүү чөйрөлөрү менен ыңгайлуу интеграциялоосу үчүн иштеп чыгуучулардын арасында популярдуу. Maven менен иштөөдө биз төмөнкү долбоордун структурасын карманабыз: Куруу эрежелери, көз карандылыктар жана башкалар 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
GO TO FULL VERSION