Maven Build Lifecycle: කම්මැලි නැතුව ඉගෙන ගමු! (Learn Maven Build Lifecycle without boredom!)

ඉතින් කොහොමද යාලුවනේ! අද අපි කතා කරන්න යන්නේ software development වලදී නැතුවම බැරි tool එකක් ගැන. ඒ තමයි Apache Maven. විශේෂයෙන්ම, Maven Build Lifecycle එක ගැන අපි හොඳටම බලමු. අලුතින් code කරන අයට වගේම, දැනටමත් code කරන අයටත් මේක ගොඩක් වැදගත් වෙයි. කලින් දවස් වල, project එකක් build කරනවා කියන්නේ හරිම headache එකක්. dependencies add කරනවා, JAR files download කරනවා, classpath set කරනවා... මේ හැමදේම manual කරන්න ගියාම වෙලාව නාස්ති වෙනවා වගේම වැරදි වෙන්න තියෙන ඉඩත් වැඩියි. අන්න ඒ වගේ තැනකදී තමයි Maven වීරයෙක් වගේ එන්නේ.
Maven කියන්නේ මොකක්ද?
Maven කියන්නේ Apache Software Foundation එකෙන් හදපු powerful build automation tool එකක්. Java project එකක් build කරනවා කියන්නේ, source code එක compile කරනවා, tests run කරනවා, package කරනවා (JAR, WAR වගේ), අන්තිමට install කරනවා වගේ වැඩ ගොඩක් තියෙනවා. මේ හැමදේම automate කරන්න තමයි Maven පාවිච්චි කරන්නේ.
Dependency management කියන එකත් Maven වල තියෙන සුපිරි feature එකක්. Library එකක් ඕන වුණාම manual download කරලා classpath එකට add කරනවා වෙනුවට, Maven ඒක automate කරනවා. ඔයාලට project එකට ඕන library එකක් තියෙනවා නම්, pom.xml
(Project Object Model) එකට dependency එක add කරාම ඇති. Maven අනිත් ඔක්කොම බලාගන්නවා. ඒක තමයි dependency transitiviy කියන්නේ.
Maven ගොඩක් වෙලාවට 'convention over configuration' කියන principle එක follow කරනවා. ඒ කියන්නේ, standard project structure එකක් follow කරනවා නම්, අපිට වෙනම ගොඩක් configuration කරන්න ඕනේ නැහැ. Maven ඒ දේවල් තේරුම් අරගෙන project එක build කරනවා.
Maven Build Lifecycle එක මොකක්ද?
Maven වලදී project එකක් build කරනකොට, ඒක හරියට පියවර ගොඩකින් යන ගමනක් වගේ. මේකට තමයි Maven Build Lifecycle එක කියන්නේ. Maven වල ප්රධාන built-in build lifecycles තුනක් තියෙනවා:
default
(or build): මේක තමයි project එක build කරලා deploy කරන්න ඕන කරන steps තියෙන ප්රධාන lifecycle එක. අද අපි වැඩිපුරම බලන්නේ මේක ගැනයි.
site
: මේකෙන් කරන්නේ project documentation generate කරන එක.
mvn site
clean
: මේකෙන් කරන්නේ කලින් build කරපු files (සාමාන්යයෙන් target
directory එකේ තියෙන files) ඔක්කොම අයින් කරන එක. අලුතින් build එකක් පටන් ගන්න කලින් මේක කරන්න පුළුවන්.
mvn clean
default
lifecycle එකේ තියෙන හැම phase එකක්ම පිළිවෙලට run වෙනවා. ඒ කියන්නේ, ඔයාලා install
phase එක run කරන්න කියලා command එක දුන්නොත්, Maven මුලින්ම validate
, ඊට පස්සේ compile
, ඊට පස්සේ test
, package
වගේ හැම phase එකක්ම පිළිවෙලට run කරලා තමයි install
phase එකට එන්නේ. ඒ වගේම, හැම phase එකකටම යටතේ goals
තියෙනවා. goals
කියන්නේ plugin එකක් කරන specific task එකක්.
ප්රධාන Maven Build Phases ටික
දැන් අපි බලමු default
lifecycle එකේ තියෙන ප්රධාන phases මොනවද කියලා:
validate
මේක තමයි build lifecycle එකේ මුල්ම phase එක. මේකෙන් කරන්නේ project එකේ POM (Project Object Model) එක හරි විදිහට configure කරලා තියෙනවද, අවශ්ය dependencies ඔක්කොම specify කරලා තියෙනවද වගේ දේවල් check කරන එක. project එක build කරන්න කලින් අවම අවශ්යතා තියෙනවද කියලා බලන්නේ මෙතනදී.
mvn validate
compile
මේක තමයි ඔයාලා ලියපු Java source code files, Java Virtual Machine (JVM) එකට තේරෙන bytecode (.class files) බවට convert කරන phase එක. මේ files තියෙන්නේ සාමාන්යයෙන් src/main/java
කියන directory එකේ. Compile කරපු files ටික target/classes
කියන directory එකේ save වෙනවා.
mvn compile
test
Project එක compile කරාට පස්සේ, ඒක හරියට වැඩ කරනවද කියලා බලන්න tests run කරන්න ඕනේ. test
phase එකෙන් කරන්නේ project එකේ unit tests run කරන එක. මේ tests තියෙන්නේ src/test/java
කියන directory එකේ. සාමාන්යයෙන් JUnit, TestNG වගේ test frameworks මේකට පාවිච්චි කරනවා. මේ tests fail වුනොත් build එක fail වෙනවා.
mvn test
Tests skip කරන්න ඕන නම්, මේ විදිහට command එක දෙන්න පුළුවන්:
mvn install -DskipTests
package
මේ phase එක තමයි ඔයාලගේ compiled code එකයි, resources (properties files, XML files, images වගේ) ටිකයි එකතු කරලා project එක share කරන්න පුළුවන් format එකකට හදන phase එක. සාමාන්යයෙන් Java application එකක් නම් JAR
(Java Archive) file එකක්, web application එකක් නම් WAR
(Web Archive) file එකක්, enterprise application එකක් නම් EAR
(Enterprise Archive) file එකක් විදිහට මේක හැදෙනවා. මේ artifact එක save වෙන්නේ target
directory එකේ.
mvn package
verify
Package කරපු artifact එක integration tests වලින් quality check කරන phase එක තමයි මේක. Unit tests වලින් individual components check කරනවා වගේ නෙවෙයි, integration tests වලින් system එකේ components එකිනෙකට සම්බන්ධ වෙලා හරියට වැඩ කරනවද කියලා බලනවා.
mvn verify
install
හදපු package එක (JAR/WAR file එක) ඔයාලගේ local Maven repository එකට install කරන phase එක. මේ local repository එක සාමාන්යයෙන් තියෙන්නේ ~/.m2/repository
කියන path එකේ. මේකෙන් වෙන්නේ, ඔයාලගේ මේ project එක වෙනත් project එකකට dependency එකක් විදිහට පාවිච්චි කරන්න පුළුවන් වෙන එකයි.
mvn install
deploy
මේක තමයි build lifecycle එකේ අන්තිම phase එක. මේකෙන් කරන්නේ local repository එකට install කරපු artifact එක remote repository එකකට deploy කරන එක. Artifactory, Nexus වගේ repository managers තමයි මේකට පාවිච්චි කරන්නේ. මේකෙන් team එකේ අනිත් අයටත් මේ artifact එක share කරගන්න පුළුවන් වෙනවා.
mvn deploy
සාමාන්යයෙන් ඔයාලා project එකක් build කරනකොට පාවිච්චි කරන command එක තමයි:
mvn clean install
මේ command එකෙන් වෙන්නේ, මුලින්ම clean
lifecycle එක run කරලා කලින් build කරපු දේවල් ඔක්කොම අයින් කරනවා. ඊට පස්සේ install
phase එකට යනකල් default
lifecycle එකේ හැම phase එකක්ම (validate
, compile
, test
, package
, verify
, install
) පිළිවෙලට run වෙනවා.
Goals සහ Phases අතර වෙනස
මේක තමයි ගොඩක් අයට පැටලෙන තැන. පැහැදිලිවම කිව්වොත්, Phase
කියන්නේ build lifecycle එකේ step එකක්. ඒක sequence එකක්. Goal
කියන්නේ specific task එකක්. උදාහරණයක් විදිහට, compiler:compile
කියන goal එකෙන් කරන්නේ Java source code compile කරන එක. මේ compiler:compile
goal එක compile
phase එකට bind වෙලා තියෙනවා.
අපිට mvn compile
කියලා කිව්වම, Maven compile
phase එකට bind වෙලා තියෙන compiler:compile
goal එක run කරනවා. ඒ වගේම, mvn test
කිව්වම, Maven test
phase එකට bind වෙලා තියෙන surefire:test
goal එක run කරනවා.
එක phase
එකකට goals
එකක් හෝ කිහිපයක් bind වෙන්න පුළුවන්. ඒ වගේම, අපිට direct goal
එකක් execute කරන්නත් පුළුවන්. mvn compiler:compile
වගේ. එතකොට අදාල goal එක විතරක් run වෙනවා. Phases හැමවිටම පිළිවෙලට run වෙනවා. Goals run වෙන්නේ අපි කියන විදිහට (phase එකක් හරහා හෝ direct).
නිරරනය
ඉතින් යාලුවනේ, Maven Build Lifecycle එක කියන්නේ මොකක්ද, ඒකේ තියෙන ප්රධාන phases මොනවද, ඒවයින් මොකක්ද වෙන්නේ කියන එක ගැන දැන් ඔයාලට හොඳ අවබෝධයක් ඇති කියලා හිතනවා. මේ concepts ටික තේරුම් ගන්න එක ඔයාලගේ project build process එක වඩා හොඳින් තේරුම් ගන්නත්, troubleshoot කරන්නත්, customize කරන්නත් ගොඩක් උදව් වෙයි. Maven build lifecycle එක හරියට තේරුම් ගන්න එක, ඔයාලගේ project build process එක speed up කරගන්න, automatic කරන්න, bugs අඩු කරගන්න ගොඩක් උදව් වෙනවා. ඒ වගේම continuous integration (CI) environments වලදී මේකේ වැදගත්කම තවත් වැඩි වෙනවා.
දැන් ඔයාලත් පොඩි Maven project එකක් හදලා මේ phases ටික run කරලා බලන්න. මොනවා හරි ප්රශ්න තියෙනවා නම් නැත්නම් අලුතින් දෙයක් ඉගෙනගත්තා නම් comment section එකේ කියන්න අමතක කරන්න එපා. අපි ආයෙත් මේ වගේම වැදගත් දෙයක් ගැන කතා කරමු. එහෙනම්, පරිස්සමින් ඉන්න!