แสดงบทความที่มีป้ายกำกับ jrebel แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ jrebel แสดงบทความทั้งหมด

วันศุกร์, ตุลาคม 30, 2558

แก้ไข JRebel error JavaLaunchHelper

ลง OS X ใหม่ ทำให้ต้องติดตั้ง JDK ใหม่ด้วย ถ้าไป download จาก Oracle OTN website ตัวล่าสุดของ JDK 7 ที่เปิดให้โหลดคือ 7u79 เมื่อติดตั้งเรียบร้อย เอามารัน tomcat ที่ config jRebel เอาไว้ จะเจอ error ลักษณะนี้ใน console


objc[7324]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.


ใน forum ของ zeroturnaround (ทีมพัฒนา JRebel) บอกเอาไว้ว่ามันเป็น bug ของ Java เอง มีการเปิด issue เอาไว้แล้วด้วย ทางแก้เท่าที่ค้นคว้าดู ตอนนี้มีทางเดียวคือกลับไปใช้ version 7u25 ดาวโหลดได้จาก OTN website ตามลิ้งข้างต้นอีกเช่นเคย

เมื่อติดตั้งด้วย .dmg ก็จะไม่มีปัญหาอะไร แต่จะเรียกใช้มันยังไงล่ะ ไอ้เจ้า version เก่า ถ้าไปเปิด post เก่า "เปลี่ยน JDK version ง่าย ด้วยคำสั่งเดียว" จะรู้ว่าเราใช้คำสั่ง $/usr/libexec/java_home ได้

แต่ทีนี้ผมลง 7u79 ไป แล้วลง 7u25 เพิ่มเข้าไปอีก เวลาสั่ง $/usr/libexec/java_home -v 1.7 มันจะได้ version ที่สูงกว่าเสมอ ลองอ่าน help ของ command line อันนี้ดูถึงรู้ว่า เราสามารถระบุได้ละเอียดกว่าแค่ 1.7 เช่นอยากได้ JDK 7u25 แทนที่จะใส่ option -v 1.7 ให้ใส่ -v 1.7.0_25 เลย

ทีนี้ script ในการรัน tomcat+JRebel ก็สามารถใช้ JDK 7u25 ได้แล้ว หน้าตาจะเป็นแบบนี้

export JAVA_HOME=$(/usr/libexec/java_home -v 1.7.0_25)
...
export CATALINA_HOME=/Volumes/MacintoshHD2/Users/HDD/apps/apache-tomcat-6.0.41
...
$CATALINA_HOME/bin/startup.sh

วันอังคาร, พฤษภาคม 26, 2558

เซตอัพ Maven, Spring Boot (spring-boot:run) กับ JRebel

   มีโปรเจคหนึ่งของผมเป็น java web application คุมด้วย maven แล้วผมอยากจะเรียกคำสั่ง mvn spring-boot:run พร้อมใช้งาน jrebel ไปด้วย

1. สร้างไฟล์ rebel.xml ก่อน เอาไว้ที่ src/main/resources
2. อ้างอิงตามเอกสารของ zeroturnaround เราใส่ content ของไฟล์ตามนี้
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">
  <classpath>
    <dir name="[absolute path to]/target/classes/"/>
  </classpath>
</application>

4. หากมี jar file ที่อยากให้ jrebel reload ให้ด้วย (jar library ที่อยากให้มัน reload คือ jar ที่ทำขึ้นมาใช้จากอีกโปรเจคหนึ่ง)
ก้อเพิ่มแบบนี้

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">
  <classpath>
    <dir name="[absolute path to]/src/main/resources/"/>
    <dir name="[absolute path to]/target/classes/"/>
    <jar name="[absolute path to a jar file].jar"></jar>
  </classpath>
</application>

path ไปยัง jar library ผมใช้วิธีชี้ไปที่ .m2/repository ,ที่ maven โหลดมา cache ในเครื่องเรา
เช่น /Users/dahoba/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar

5. เวลา execute mvn spring-boot:run เพิ่ม option แบบนี้

$ mvn spring-boot:run -Drun.agent=[/Users/dahoba/app/jrebel-nightly/jrebel]/jrebel.jar

- เพิ่ม -Drun.agent เข้าไป
- path ใน [ ] คือ absolute path ไปยัง jrebel.jar ที่ติดตั้งอยู่ในเครื่อง

เท่านี้เอง ใช้งาน jrebel ให้มันช่วย reload โปรเจค ที่เป็น spring-boot + maven ได้แล้ว



วันพุธ, กุมภาพันธ์ 04, 2558

แก้ปัญหา JRebel ใช้งานไม่ได้ ค้างที่ Contacting myJRebel server ..

วันดีคืนดีหลังจาก upgrade version jrebel จาก version 5 เป็น version 6 จู่ๆ tomcat ก็ start ไม่ขึ้น ต้อง kill process ลูกเดียว วันดีคืนดีมันก็ start ได้ แต่โอกาสคือ 1 ใน X ครั้ง เรียกว่าฟลุ๊คเท่านั้นดีกว่าที่จะ start ได้ มันค้างอยู่ตรง message

...
JRebel-Licensing-myJRebel: Contacting myJRebel server ..
...

  JRebel คืออะไร มันเป็นเครื่องมือตัวหนึ่ง ที่เอามาผูกการทำงานเข้ากับ java container (tomcat, weblogic, websphere ฯ) แล้วทำให้ code ที่เราเขียนจะถูก reload ให้เลย ไม่ต้องสั่ง stop/start container นั้นใหม่ ประหยัดเวลามาก ถึงมากที่สุด

ส่วนวิธีใช้ลองไปศึกษา JRebel พลางๆที่ website ของ JRebel นะครับ

  ผมใช้ jrebel ด้วย license แบบ social license คือเค้าจะขอ tweet สถิติการใช้งาน jrebel ของ account เรา ประมาณว่าประหยัดเวลาให้เราในการ stop/start java container ไปมากเท่าไหร่ โดย license  ทั่วไปหากใช้งานคนเดียว single developer เค้าคิดวันละ 1 USD แต่เก็บเป็นรายปี

เข้าเรื่องดีกว่า วิธีแก้ไข

    ทดลองเปิด debug log โดยใส่ java parameter (JAVA_OPTS) เข้าไป -Xdebug -Drebel.log=debug แล้วไปดู jrebel.log โดยมันจะถูกสร้างเอาไว้ที่ /Users/siritas_s/.jrebel
ก็ยังไม่เจออะไรนอกจากเห็นว่ามันโหลด plugins มากมายเต็มไปหมด (น่าจะเป็น plugin สำหรับให้มัน reload classes ของ framework เจ้าดังๆได้ถูกต้อง)

  และจากที่ไปลองค้นๆอ่านๆใน forum support ของ jrebel เค้าแนะนำให้
* โหลด version nightly มาใช้  หรือ/และ
* ทดลองปิด plugin ทั้งหมดดูก่อน ทำได้โดยการใส่ option rebel.load_embedded_plugins=false ใน jrebel.properties

การปิด plugin ทั้งหมด 
Modify .jrebel/jrebel.peoperties:
...
rebel.load_embedded_plugins=false
...

  เห้ย..ย ได้ผล! jrebel กลับมาใช้งานได้อีกครั้ง วิ่งผ่าน Contacting myJRebel server .. แล้วแสดง banner ได้เหมือนปกติ
...
015-02-04 15:47:53 JRebel:
2015-02-04 15:47:53 JRebel:  #############################################################
2015-02-04 15:47:53 JRebel:
2015-02-04 15:47:53 JRebel:  JRebel Legacy Agent 6.1.0-SNAPSHOT (201502032154)
2015-02-04 15:47:53 JRebel:  (c) Copyright ZeroTurnaround AS, Estonia, Tartu.
2015-02-04 15:47:53 JRebel:
2015-02-04 15:47:53 JRebel:  Over the last 6 days JRebel prevented
2015-02-04 15:47:53 JRebel:  at least 14 redeploys/restarts saving you about 0.6 hours.
2015-02-04 15:47:53 JRebel:
... 

  หลังจากนั้นมาแก้ตัว parameters ที่ใส่ให้ jrebel.jar เพื่อเปิดใช้เฉพาะ plugin ที่ต้องการใช้

ของเดิมของผมเป็นแบบนี้ (คือโหลด plugins ทุกตัวที่ default มาให้)
...
export JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxPermSize=256m \
-Dapple.awt.UIElement=true -Djava.awt.headless=true \
-javaagent:lib/jrebel.jar \
-javaagent:lib/aspectjweaver.jar \
-Xdebug -Drebel.log=false 
... 

ผมใช้ springframework, log4j 1.2 จึงเปลี่ยนเป็นแบบนี้ 
...
export JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxPermSize=256m \
-Dapple.awt.UIElement=true -Djava.awt.headless=true \
-javaagent:lib/jrebel.jar \
-javaagent:lib/aspectjweaver.jar \
-Xdebug -Drebel.log=false \
-Drebel.fsnotify_intellij_plugin=false \
-Drebel.aspectj_plugin=true -Drebel.log4j_plugin=true \
-Drebel.spring_plugin=true -Drebel.tiles1_struts_plugin=true
... 

เท่านี้ก็กลับมาใช้ JRebel ได้เหมือนเดิมแล้ว ^^ blog เป็นภาษาไทยในใจก็คิดว่าจะมีคนไทยซักกี่คนที่ใช้ JRebel เหมือนผมเนี่ย..ย ใครใช้ก็มาแลกเปลี่ยนประสบการการใช้งานกันได้นะ