Posts Tagged ‘autoload’

ZeroTurnAround เขียน Spring ไม่ต้อง redeploy ราคา (* 59 35)

May 7th, 2009

ระหว่างเตรียมตัวเรื่อง Terracotta สำหรับงาน NJUG7 เนื่องจากเรื่อง Cluster, HA, Cache เป็นเรื่องที่เข้าใจได้ยากมากเจึงทำให้ไม่สามารถเดินหน้าไปได้เร็วมากนัก หยุดๆเดินๆ ไปเรื่อยๆระหว่างหยุดก็ทำอย่างอื่นเช่น อ่าน LISP อ่านโน่น อ่านนี่ แซวลิเวอร์พูลใน twitter จนกระทั่งสามวันก่อนไปอ่านบทความใน TheServerSide เรื่อง How Do Java Developers Edit-In-Place and Monitor? เค้าก็พล่ามเรื่องทำไม เมื่อไหร่ Java Developer จะสามารถทำได้เหมือน PHP คือแก้แล้วเห็นการเปลี่ยนแปลงเลยโดยไม่ต้อง Redeploy หรือ Restart Application Server ซึ่งปัญหานี้เป็นเรื่องทิ่มแทงหัวใจผมมาตลอดคือเราไม่สามารถทำงานได้อย่างต่อเนื่องได้เต็มที่กับภาษา Java เนื่องจากแนวคิด “Once it is loaded, it can not be changed” แต่หลังๆ Framework สมัยใหม่ก็แก้ไขเรื่องนี้ไปได้แล้วสองตัวคือ Tapestry และ SEAM ซึ่งแน่นอนผมเขียนไม่เป็น ผมเขียนได้ดีเฉพาะ Spring เท่านั้นแล้วมันก็ยังไม่ได้แก้เรื่องนี้ด้วย

แต่หนึ่ง comment ในนั้นทำให้ผมตกใจ มีคนพูดถึง JavaRebel ขึ้นมาผมก็ตามไปดูที่เวบ เค้าก็โฆษณาว่า “JavaRebel is a JVM plugin (-javaagent) that enables you to see changes to your code immediately, without the need to redeploy an application or perform a container restart” เอาสิเจอแบบนี้ก็ต้องลอง เรามาลองกันไหม

แต่ทั้งนี้ทั้งนั้น เราต้องเสียเงินนะครับถ้าใช้เป็นเรื่องเป็นราว สนน ราคาอยู่ที่ 2,000 บาทสำหรับ personal license และ 15,000 บาทสำหรับ business license ในใจผมถ้าทำได้จริงผมยอมเสียตังซื้อเพราะผมไม่ต้องทรมานกับการ Redeploy, Restart บ่อยๆจนบางทีเซ็ง

เรามาลองกันเลย

ไป download ไลบรารี่มาก่อนที่ http://www.zeroturnaround.com/javarebel/

จากนั้นเราก็ต้องบอกให้ Servlet Container ที่เราใช้ว่าเราช่วยโหลดได้นี่เข้าไปหน่อยนะจังหวะที่มัน Start-up ซึ่งในที่นี้ผมประมาณว่าทุกคนใช้ Tomcat นะครับ ดังนั้นสิ่งที่เราต้องทำคือ ไปที่ catalina.bat แล้วเพิ่มคำสั่งนี้เข้าไป ( เอาไว้ประมาณ บรรทัดที่ 231)

 set JAVA_OPTS=-noverify -javaagent:{PATH_TO_JAVAREBEL}javarebel.jar %JAVA_OPTS% 

ต่อไปกันว่าว เราต้องลอง start ก่อนว่ามีอะไรเสียหายหลายแสนหรือป่าวกับสิ่งที่เราเพิ่มเข้าไปด้วยการเรียก

catalina.bat run

ถ้าที่ comsole มีข้อความนี้แสดงขึ้นมาแสดงว่าเรามาถูกทาง

#############################################################

ZeroTurnaround JavaRebel 2.0 (200903241906)

(c) Copyright Webmedia, Ltd, 2007-2009. All rights reserved.

จากนั้นเราควรจะลองเอาอะไรโง่ๆมาลองเล่นดู สามารถทำได้โดยการสร้าง HelloWorld Servlet มาสักตัวครับ ในที่นี้ผมใช้ Maven นะเพราะมันจะได้เป้นมาตรฐานเดียวกัน โดยเราสามารถสั่งคำสั่งนี้

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp

เราก็จะได้เวบโปรเจคโง่ๆมาหนึ่งอันหนึ่งชื่อ my-webapp จากนั้นเราต้องเพิ่มความสามารถของ JavaRebel เข้าไปให้ maven ด้วยโดยให้เราเปิด pom.xml ขึ้นมาแล้วเพิ่ม plugin เข้าไปดังนี้

ที่บรรทัดประมาณที่ 11

    <pluginRepositories>
        <pluginRepository>
            <id>zt-repo</id>
            <name>Zero turnaround repo</name>
            <url>http://repos.zeroturnaround.com/maven2</url>
        </pluginRepository>
    </pluginRepositories>

อีกส่วนที่ประมาณบรรทัดที่ 139 ในส่วนของ plugins

            <plugin>
                <groupId>org.zeroturnaround</groupId>
                <artifactId>javarebel-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate-rebel-xml</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

เมื่อเรียบร้อยแล้วให้สั่ง mvn javarebel:generate คำสั่งนี้จะไปสร้างไฟล์ชื่อ rebel.xml ที่ WEB-INF/classes ครับโดยไฟล์นี้จะทำหน้าที่กำหนด target ที่เก็บ class ไฟล์และ resources ต่างที่เราต้องการให้ทำ auto-reload เมื่อเกิดการเปลี่ยนแปลง

จากนั้นให้ทำการบอก Tomcat ให้มาอ่าน Application ของเราที่ {PROJECT_PATH}\target\my-webapp แทนที่จะทำการ pack เป็น WAR เพราะระหว่าง develop เราคงไม่ประสาทแดก pack เป็น WAR กันตลอดโดยการไปสร้างไฟล์ชื่อ my-app.xml ไว้ที่ {TOMCAT_HOME}\conf\Catalina\localhost มีรายละเอียดดังนี้

<?xml version="1.0" encoding="UTF-8"?>
<Context
    docBase="D:\WORKSPACE\beg\my-webapp\target\my-webapp">
</Context>

เอ้าเสร็จแล้วครับตามนี้ ลองเขียน Servler HelloWorld โง่ๆสักอันถ้าใช้ Eclipse ก็ทำการแก้ไข save แล้ว refresh ดูครับ มันเทพมากๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ