[Java] รู้จัก Maven ให้มากขึ้น เพื่อก้าวสู่ java professional

          ถึงวันนี้คงไม่มี java dev คนไหนไม่ยอมใช้ maven กันอีกแล้ว แต่คงต้องอธิบายกันหน่อยเผื่อบางท่านมาจากภาษาอื่น ไม่ว่ากันครับ :D

maven คือ ??

          maven เป็น build tool ที่มีคลัง java source code หรือเรียกอีกอย่างว่า dependency เป็นของตัวเองอย่าง maven repository (https://mvnrepository.com/) ซึ่งประกอบด้วย library, plugin, archetype ให้เลือกใช้มากมาย ซึ่ง editor ส่วนใหญ่ก็รองรับกันอยู่แล้ว บางตัวก็มีติดมาในตัวเลย ไม่ต้องติดตั้ง maven เองเพิ่ม แต่ผมก็แนะนำให้ download แยกต่างหากนะ

ตัวอย่างโครงสร้าง maven project บน IntelliJ IDEA
*.idea, *.iml เป็นไฟล์เฉพาะของ IntelliJ project ไม่ต้องสนใจ 
          pom.xml คือ ส่วนสำคัญที่สุดของ maven project เราจะต้องระบุการเรียกใช้งาน dependency, plugin จะถูกเขียนไว้ที่ไฟล์นี้ ในรูปแบบ xml

ตัวอย่าง pom.xml
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelversion>4.0.0</modelversion>

    <groupid>th.in.lordgift</groupid>
    <artifactid>DemoMaven</artifactid>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--

        <dependency>
            <groupid></groupId>
            <artifactid></artifactId>
            <version></version>
        </dependency>

        ...

        -->

    </dependencies>

</project>
สังเกตว่า maven จะ ใช้ attribute 3 ค่านี้เสมอ
  • groupId คือ ชื่อ package ควรใช้ตัวอักษรตัวเล็กทั้งหมด เช่น th.in.lordgft
  • artifactId คือ ชื่อ project เช่น DemoMaven
  • version คือ version สำหรับ build สามารถใช้อักขระร่วมกับตัวเลขได้ เช่น 1.0-SNAPSHOT
          ซึ่งไม่ว่าจะเป็นการสร้าง maven project หรือการ download dependency จำเป็นต้องระบุ attribute ให้ถูกและครบด้วย ไม่งั้น maven อาจดึงของมาให้เราผิด

การใช้งาน maven ผ่าน command-line

          Apache Maven สามารถ download ได้ฟรี หลังจากติดตั้งทดลองใช้คำสั่งบน cmd / terminal
mvn --version

          การใช้งานต้อง change directory (cd) ไปที่ root ของ maven project ก่อน จากนั้นจะสามารถใช้งานคำสั่งต่าง ๆ ได้ เช่น
mvn clean
mvn package
mvn install
          หรือจะรวมและสั่งทีเดียว
mvn clean package

          แต่บางครั้ง dependency ที่เราดึงมาก็อาจดึง dependency อื่นต่ออีกทีนึง เมื่อไรเลือกใช้ library จำนวนมาก ก็อาจจะต้องตรวจสอบกันหน่อย
mvn dependency:tree
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.0.0.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot:jar:2.0.0.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-context:jar:5.0.4.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.0.0.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.0.RELEASE:compile

.....

Build tool & Dependency

          ในส่วนของ maven อาจสร้างความกำกวมให้เล็กน้อย เพราะตัวมันเบ็ดเสร็จในตัวเอง
  • Build tool เป็นเครื่องมือในการ build project (ไม่ใช่ compiler นะ) ตัวอย่างเช่น gradle, ant เป็นต้น 
  • Dependency เป็นการดึงเอา source code มาจาก repository ซึ่งในปัจจุบันก็มี repository มากมาย ทั้ง maven เอง (java), jCenter (java), cocoapods (xcode project) หรือในองค์กรก็อาจทำ repository ขึ้นมาเฉพาะก็มี

          ถึงแม้ว่าปัจจุบัน gradle จะมาแรง และมีผู้ใช้บ้างแล้ว แต่ถ้าสังเกตดี ๆ การเรียกใช้งาน repository ก็จะชี้ไปที่ maven central อยู่นะ
//build.gradle
group 'th.in.lordgift'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
          แอบแถมของมาให้นิดหน่อย build.gradle เปรียบเสมือน pom.xml แต่เป็นของ Gradle project ดู ๆ ซึ่งดูดีกว่า xml เยอะ ภาษาที่ build.gradle ใช้คือ groovy ซึ่งมาฐานมาจาก java แต่ถึงอย่างนั้นก็ไม่จำเป็นจะต้องศึกษา groovy เพื่อเขียน build.gradle ก็ได้ครับ


Facebook Comment

Recent Posts

Popular post of 7 days

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

เรื่องของ ++i กับ i++

Popular

[Java] Java 8 DateTime ใหม่ ไฉไลกว่าเดิม

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

เรื่องของ ++i กับ i++

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

Port Forwarding สำหรับคนใช้ AIS Fibre

[Java] Java Static Variable และ Static Method

วิธีการสมัคร Apple Developer Program และ Enterprise Program ฉบับลงมือเอง

Android Auto & Apple Carplay คืออะไร ใช้งานยังไง