go to http://oracle.in.th

Tuesday, March 30, 2010

Jar File...รวม library ทั้งหลาย ให้เป็น file เดียว

บทความคราวนี้ ผมได้พบมาจากประสบการณ์ในการทำงานของผมเลย ก็เลยคิดว่า น่าจะเอามาบอกต่อหน่อย เผื่อจะได้เป็นประโยชน์ให้แก่คนที่พบคำถามแบบนี้จากผมนะครับ...

สาเหตุของปัญหานี้ก็คือ พอดีมีลูกค้ามาถามผมว่า "ปกติเวลาเราเขียน application ของ java ส่วนใหญ่มักจะประกอบไปด้วย library (jar) หลายๆตัว เมื่อเราเขียน application เสร็จแล้วถ้าเราจะเอา application ตัวนี้ไปใช้ก็ต้องยกโขยง library ต่าง ๆ ของเราไปด้วย ไม่งั้นจะทำงานไม่ได้"
จึงเกิดคำถามที่ว่า...จะทำอย่างไรที่จะรวม library ต่าง ๆ เหล่านี้เป็น jar ตัวเดียว??


ซึ่งจริง ๆ แล้ว การที่เราต้องยกโขยง library ต่าง ๆ ของ application ไปทั้งหมด มันเป็นสิ่งที่ไม่สะดวกเลยจริง ๆ ดังนั้น จึงมีวิธีการที่เรียกว่า Jar File หรือ Java ARchive ซึ่งเป็นการรวมหลาย ๆ ไฟล์เป็นเป็นไฟล์เพียงตัวเดียว ซึ่ง Developer มักจะใช้การสร้าง .jar ไฟล์นี้ในการทำ Java applications หรือ libraries ซึ่งจะมีทั้งข้อมูล classes, metadata และข้อมูลที่เป็น text, images, และอื่น ๆ อีกมากมาย

ซึ่งตัว JAR file นี้ จะถูกสร้างออกมาในรูปแบบของ ZIP file เมื่อต้องการจะแตก (extract) JAR file ได้โดยพิมพ์คำสั่ง jar command ที่มากับ JDK นั่นเอง

เรามาดูวิธีการทำ Jar File กันเลยดีกว่า
Step 1:
ให้สร้าง xml file โดยตั้งชื่อเป็น "build.xml" แล้วใส่คำสั่งตามข้างล่างนี้

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_jar" name="Create Jar for Project TodoListTool">
  <!--this file was created by Eclipse Runnable JAR Export Wizard-->
  <!--ANT 1.7 is required                                        -->
  <target name="create_jar">
<jar destfile="C:/Documents and Settings/com11/Desktop/de.allianz.vpl.VPLTransformer.jar"
         filesetmanifest="mergewithoutmain">
<manifest>
        <!--<attribute name="Main-Class" value="systemtool.guiApplication.GuiApplication" />-->
        <attribute name="Class-Path" value="." />
      </manifest>
     
      <fileset dir="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/bin" />

      <zipfileset excludes="META-INF/*.SF"                                                                    
                 
src="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/lib/jdom.jar" />
      <zipfileset excludes="META-INF/*.SF"
                 
src="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/lib/de.allianz.jFrame.jni.jar" />
      <zipfileset excludes="META-INF/*.SF"
                 
src="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/lib/utility.jar" />
      <zipfileset excludes="META-INF/*.SF"
           
src="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/lib/org.eclipse.swt_3.5.0.v3550b.jar" />
      <zipfileset excludes="META-INF/*.SF"           
     
src="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/lib/org.eclipse.swt.win32.win32.x86_3.5.0.v3550b.jar" />
    </jar>
  </target>
</project>

ผมขออธิบายคำสั่งที่สำคัญ 4 ส่วน ก่อนนะครับ

<jar destfile="C:/Documents and Settings/com11/Desktop/de.allianz.vpl.VPLTransformer.jar"
         filesetmanifest="mergewithoutmain">
destfile: it is destination result of jar file.

<fileset dir="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/bin" />
dir: it is result path of build java class (*.class). In Eclipse \bin.


<zipfileset excludes="META-INF/*.SF"                                                                    
            
src="D:/java/jFrame_WorkSpace/de.allianz.vpl.VPLTransformer/lib/jdom.jar" />
src: it is path of reference jar file.

และ


<!--<attribute name="Main-Class" value="systemtool.guiApplication.GuiApplication" />-->
จริง ๆ แล้วคำสั่งนี้ใช้สำหรับสร้าง execute jar file ถ้าต้องการสร้าง ให้เอาคำสั่ง Comment ออก แล้วใช้คำสั่งนี้แทน (ซึ่งตามตัวอย่าง ไม่ต้องการสร้าง เลยทำเป็น Comment ไว้)
value: This value is main class.

Step 2:
ให้ Copy "build.xml" ที่เรา้เพิ่งสร้างเมื่อกี้ นำไปไว้ที่ root directory ของโปรเจค (ตามรูป)


Step 3:

คลิกขวาที่ "build.xml" เลือก Run As > Ant Build


เท่านี้ก็เรียบร้อยครับ ^^

Credit by @plaumkamon
ข้อเขียนนี้ช่วยฉัน:  

No comments:

Post a Comment