Skip to main content

Apache Ant


Apache Ant

Apache Ant เป็น project opensource ของ Apache ที่จะช่วยให้ในการ build ในการ compile และทำให้งานของ programmer นั้นง่ายมากขึ้น ซึ่งใน project ในระดับ enterprise ของ java มักจะใช้ ant ช่วยในการ build ยัน deploy และใน IDE Java แทบทุกตัวของ Java ก็ใช้ Apache ant ในการ build, compile, หรือ pack เป็น archive file ซึ่งผมจะเกริ่นเครื่องของ ant คร่าวๆดังดังนี้ครับ การจะใช้ Apache Ant ได้ต้องติดตั้งดังนี้ครับ
  • Apache Ant : load here
  • Java RE(แนะนำติดเป็น SDK ไปเลย) 1.4 ขึ้นไป
การติดตั้ง java นั้นขอข้ามไปเลยมาพูดเรื่องติดตั้ง apache ant กันเลย ก่อนอื่นนำ apache ant ที่เราโหลดมานำมา extract
มาวางไว้ที่ไหนก็ได้แต่ถ้าจะให้สะดวกให้มาวางไว้ที่ drive C: จากนั้นก็ต้อง set environemnt variable ครับ ใน windows ลองตาม link นี้ไปดูครับว่าตั้งยังไงโดยที่สำคัญที่ต้อง set มีสองค่าครับ
  • set ANT_HOME=C:apache-ant-1.7.0
  • set PATH=%PATH%;%ANT_HOME%bin;.;

จากนั้นเราลอง test ดูว่าที่เราติด ant ลงไปนั้นสำเร็จมั้ยด้วยคำสั่งนี้
  • ant -version
ถ้าผ่านได้ก็จะได้ผลลัพธ์ออกมาดังนี้
  • Apache Ant version 1.7.0 compiled on December 13 2006
จากนั้นเราลองมาดูกันว่าการจะใช้ ant
จริงนั้นต้องมีองค์ประกอบอะไรบ้าง
  • build.xml
build.xml เป็น file ที่เป็นตัว config ว่าจะให้ ant ของเราทำอะไรบ้างเช่น build project, compile, บลา ……..
ซึ่งที่ต้องละว่าบลาๆๆๆๆ นั้นเพราะว่า ant นั้นทำได้หลายอย่าง นอกจากจะใช้กับภาษา java ได้แล้วยังต่อ database ต่อ mail
เพื่อไปทำอะไรบางอย่างก็ได้ และยังไปทำงานกับภาษาอื่นได้ด้วยเช่น ruby, jython หรือแม้แต่กระทั้ง javascript ต่อมาเรามาดูโครงสร้างของ xml ใน build.xml กันดีกว่าว่าเป็นยังไง โดยปกติแล้วใน build.xml
โดยปกติแล้วจะมีหน้าตาแบบนี้
<project name="MyFirstAnt" default="greet">   
 <property name="name" value="John"/>
 <target name="greet">       
  <echo>hello everybody</echo>
  <echo>my name is ${name}</echo>      
 </target> 
 <target name="bye" depends="greet">
  <echo>bye ${name}</echo> 
 </target> 
</project> 
จาก code ด้านบนอาจจะงงแต่จะขออธิบายโครงสร้างหลักๆของ ant ดังนี้ ใน build.xml 1 อันจะมี project อยู่ 1 project โดยที่ภายใน project นั้นมี target ได้หลายๆ target และในแต่ละ target ก็จะมี task อยู่ และสามารถมี task ได้หลาย task โดยที่บางครั้งเราอาจจะมีค่าบางค่าที่ใช้หลายๆที่ เราก็จะประกาศเป็น property เพื่ออ้างถึงในหลายๆส่วน
  • target : โดย target นี้เรามองเป็นเหมือนเป็น procedure ที่ด้านในจะประกอบไปด้วยงานย่อย (task) ที่มาร้อยเรียงกันกลายกันเป็น procedure
  • task : คือการทำงานใดการทำงานหนึ่งที่มีลักษณะเป็นงานย่อยๆ ที่สามารถนำประกอบกันแล้วกลายเป็น procedure (target)
  • property : ตัวนี้เป็นการกำหนดค่าคล้ายการประกาศ variable ที่ต้องประกาศชื่อและ assign value ลงไป ประกาศไว้เพื่อความสะดวกในบางทีค่าบางค่านั้นถูกเรียกใช้ในหลายๆที่ ทำให้การแก้ไขภายหลังนั้นได้เพราะว่าแก้แค่ที่เดียวเท่านั้น
พอจะเข้าใจโครงสร้างบ้างแล้วนะครับที่นี้เราจะอธิบายเข้าไปในการทำงานของ xml นะครับ ในหนึ่ง build.xml เราสามารถการ config สั้นสุดเท่านี้ครับ คือใน project นั้นไม่มี task หรือว่า target ใดๆทั้งสิ้น ดังนั้นตอนเราลอง run ant ก็จะไม่มีการทำงานใดแต่ถ้าเราต้องลองเขียน build.xml เพื่อให้ ant ลองทำงานดูก็ง่ายๆครับลองเปลี่ยน config ดังด้านล่างครับ
<project name="MyFirstAnt" default="greet">
  <echo>hello world</echo>
</project>
การเรียก task echo นั้นก็เหมือน System.out.println(”hello world”); ใน java ครับซึ่งจะมี task อย่างเดียวโดยที่ไม่มี target ก็ได้ครับ ต่อมาเราจะมาดู build.xml ที่เต็มสูบกันดูครับ

<project name="MyFirstAnt" default="greet">
  <property name="name" value="John"></property>
  <target name="greet">
    <echo>hello everybody</echo>
    <echo>my name is ${name}</echo>
  </target>
  <target name="bye" depends="greet">
    <echo>bye ${name}</echo>
  </target>
</project>

ในนี้จะมี target อยู่ 2 target คือ greet และ bye ครับโดยที่เราสามารถให้ target แต่ละ target นั้นมี dependency ได้ครับคือก่อนที่จะรัน target อะไรต้องทำ target อะไรก่อนเช่นในตัวอย่างนี้ ก่อนจะทำ target bye เราต้องทำ target greet ก่อนครับ และในตัวอย่างนี้มีการใช้ property ด้วย เนื่องจากว่า ชื่อของ John นั้นอ้างมากกว่าหนึ่งที่เราเลย set property เพื่อที่จะอ้างถึงได้ง่าย
***สังเกตุนะครับว่าตรง project ครับเรามีการกำหนด default โดย set target greet เป็น default
การ run นั้นต้อง run ใน command promt แล้วต้องเข้าไปอยู่ใน directory ที่มี build.xml อยู่ด้วยและต้อง set environment ตามด้านบนก่อนจากนั้นในคำสั่ง ant ดังนี้
  • ant
ก็จะได้ผลลัพธ์ดังนี้
Buildfile: D:\xxx\build.xml
greet:
     [echo] hello everybody
     [echo] my name is John
BUILD SUCCESSFUL
Total time: 1 second
สังเกตว่า มันจะ run target greet เพราะว่าตรง ตั้ง default เป็น target greet แต่ถ้าเราต้องการจะ run target bye ตอน run เราสามารถระบุ target ได้ว่าจะเอา target อะไรดังนี้
  • ant bye
ก็จะได้ผลลัพธ์ดังนี้
Buildfile: D:\xxx\build.xml
greet:
     [echo] hello everybody
     [echo] my name is John
bye:
     [echo] bye John
BUILD SUCCESSFUL
Total time: 94 milliseconds
จะพบว่าจะ run target greet ก่อน bye เพราะว่าตรง <target name="”bye”" depends="”greet”"> มีการ set dependency ก่อน run target bye ต้อง run target greet ก่อน</target>การเปลี่ยนค่าของ property นั้นสามารถเปลี่ยนตอน run time ได้ไม่จำเป็นต้องเปลี่ยนใน xml เสมอไปดังตัวอย่างด้านล่าง
  • ant bye -Dname=Jack
ได้ผลลัพธ์ดังนี้
Buildfile: D:\xxx\build.xml
greet:
     [echo] hello everybody
     [echo] my name is Jack
bye:
     [echo] bye Jack
BUILD SUCCESSFUL
Total time: 94 milliseconds
syntax การเปลี่ยน property ดังนี้ -D<property-name>=</property-name>
จากด้านบนนี้เป็นไงบ้างครับแต่ว่า task นั้นไม่ได้มีแค่ echo เท่านั้นลองไปดูใน document ของ apache ต่อได้ครับ
ปล. หนังสือ apache ant ภาษาไทยของ ดร.วีระศักดิ์ ซึงถาวร เยี่ยมมากครับ

Comments

Popular posts from this blog

ลองเล่นและเรียนรู้พื้นฐานขั้นต้นของ Spring Framework

** สำหรับใครที่ไม่เคยเรียนรู้ในด้านของ Java EE หรือ J2EE อาจจะมึนงงกับศัพท์หน่อยครับ ทำไมต้อง Spring Spring เป็น framework ที่นิยมมากในการนำไปสร้างระบบในระดับ enterprise ในเริ่มแรกที่ Spring เกิดมา มีจุดมุ่งหมายเพื่อที่จะมาแทนที่มาตรฐานของ Java อย่าง J2EE (Java 2 Enterprise Edition) ที่มันทั้งหน่วงทั้งอืดและยุ่งยาก โดยเฉพาะในส่วนของ EJB (Enterprise Java Bean) ที่ถือว่าเป็นฝันร้ายของนักพัฒนา ทำให้กูรูสาย Java ในช่วงนั้นถึงกับแนะนำว่า ถ้าจำเป็นที่ต้องพัฒนาระบบด้วย J2EE จงอย่าใช้ EJB ถึงขั้นถึงกับมีหนังสือแนะแนวทางการพัฒนาระบบ J2EE โดยไม่ใช้ EJB อย่างไรก็ตามทาง Sun ผู้เป็นเจ้าของ Java ในสมัยนั้น ถึงกับต้องมาล้างระบบ J2EE ใหม่ในปี 2006 จัดการใน EJB ให้ใช้ง่ายขึ้น มีประสิทธิภาพมากขึ้น และมีการเปลี่ยนชื่อจาก J2EE เป็น Java EE (Java Enterprise Edition) เพื่อลบภาพอันเลวร้ายของเดิมให้หมด และได้มีการนำฟีเจอร์เด็ดๆ ของ open source framework หลายๆ ตัว อย่างเช่นแกนหลักของ Spring อย่าง IoC (Inversion of Control) หรือ OR Mapping (Object Relational Mapping) ที่เป็นที่นิยมอย่าง Hibernate แต่ก็ไ

ลองเล่น Lambda Expression ฟีเจอร์เด่นใน Java 8

ประวัติความเป็นมาของ Lambda expression Lambda expression ไม่ใช่สิ่งแปลกใหม่ในวงการ ภาษาโปรแกรม ( Programming Language ) เพราะ lambda มันเป็นแกนหลักของ การเขียนโปรแกรมเชิงฟังก์ชัน ( Functional Programming ) ซึ่งมีอายุมานานมากแล้ว แต่ Java เพิ่งนำเอาคุณสมบัตินี้เอามาใส่ลงในเวอร์ชัน 8 หากจะกล่าวถึงที่มาของ lambda คงต้องไปดูที่ถึงที่มาของ lambda calculus ซึ่งถูกสร้างขึ้นมาตั้งแต่ปี 1930 โดยนักคณิตศาสตร์ชาวอเมริกัน  Alonzo Church  เพื่อใช้ในการแก้โจทย์ปัญหาทางคณิตศาสตร์ที่มีความซับซ้อน ในบางครั้งสมการทางคณิตศาสตร์ที่ยาวไปอาจจะทำให้เกิดความซับซ้อนโดยใช่เหตุ lambda calculus จะทำการยุบบางส่วนของสมการนั้นออกมาเป็นฟังก์ชันย่อยๆ เพื่อทำให้สมการนั้นเข้าใจง่ายขึ้น ต่อมาหลักการของ lambda calculus ได้ถูกนำไปใช้ใน Turing Machine ซึ่งเป็นแบบจำลองในอุดมคติของ Alan Turing  ที่ต่อมากลายเป็นต้นแบบที่ถูกนำไปใช้ในการผลิต  Von Neumann Machine  ซึ่ง Von Neumann Machine ตัวนี้ได้กลายเป็นต้นแบบของคอมพิวเตอร์เครื่องแรกของโลกในเวลาต่อมา ท้ายที่สุดแนวคิดของ lambda calculus ก็ถูกนำมาแปลงเป็นภาษาโปรแกรมท

ลองเล่น SonarQube คลื่นโซนาร์ช่วยตรวจสอบคุณภาพของ code

SonarQube  คือเครื่องมือช่วยตรวจสอบคุณภาพของ source code ช่วยหาข้อบกพร่องใน source code ไม่ว่าจะเป็น Bug ที่น่าจะเกิดขึ้น ช่องโหว่ทางด้านความปลอดภัยหรือกลิ่นไม่ดีใน source code ของเรา (Code Smell) และ ช่วยตรวจสอบเราเขียน code ทดสอบครอบคลุมหรือดีแล้วยังยัง (code coverage) Code Smell ไม่ได้ใช้วัดว่า source code นี้สามารถทำงานได้ถูกต้อง มี bug หรือช่องโหว่หรือไม่ แต่ Code Smell ใช้วัดถึงคุณภาพของการออกแบบ เพื่อตรวจสอบว่า source code ที่เป็นอยู่ในปัจจุบันจะสามารถต่อเติม แก้ไขหรือทดสอบได้ง่ายหรือไม่ โดยหลักเกณฑ์ที่นำมาใช้วัดในส่วนของ Code Smell คือ ความซ้ำซ้อนของ code มี code แบบเดียวกันไปซ้ำกันในไฟล์ไหนบ้าง ตรวจสอบเงื่อนไขใน if ให้ ว่าเงื่อนไขตรงนี้มันมีโอกาสเป็นไปได้ไหม เพราะบางทีเงื่อนไขที่เราเขียนขึ้นมาเพื่อดักไว้ในบางครั้งมันแทบจะไม่มีโอกาสที่เวลามันทำงานแล้วเข้าเงื่อนไขในส่วนนั้น เป็นต้น สามารถไปอ่านรายละเอียดเพิ่มเติมได้ที่นี่ http://www.somkiat.cc/code-smell-internal-class/ นอกจาก SonarQube จะสามารถบอกถึงคุณภาพของ source code เราได้แล้ว ยังสามารถใช้ในการแจกแจงงานให