ในโครงการ Java หลายโครงการมักจะเห็นว่าพารามิเตอร์ที่กำหนดเองของโปรแกรมเรียกสคริปต์เชลล์บรรจุภัณฑ์ Java ตัวอย่างเช่น,
$ ant_home/bin/ant, $ groovy_home/bin/groovy
แม้ในโปรแกรม TimeMachine Scheduler ของเราจะสามารถเห็นได้
$ etmachine_home/bin/scheduler.sh
มันน่าเบื่อและง่ายต่อการทำสคริปต์บรรจุภัณฑ์เหล่านี้ ปัญหาส่วนใหญ่มาจากการตั้งค่า classpath ที่ถูกต้องเป็นโปรแกรม หากคุณกำลังพัฒนาโครงการภายในสำหรับ บริษัท คุณอาจอยู่ห่างจากเส้นทางที่ยุ่งเหยิงและปัญหาตัวแปรสิ่งแวดล้อม แต่สำหรับโครงการโอเพ่นซอร์สผู้คนจำเป็นต้องทำให้บรรจุภัณฑ์มีความยืดหยุ่นและเป็นสากลมากขึ้น มีการจัดเตรียมรุ่น. bat ส่วนใหญ่ Windows DOS เป็นอาคารผู้โดยสารที่โหดร้ายและถูก จำกัด โดยไม่ต้องทำตามความต้องการสคริปต์โครงการของคุณ ดังนั้นฉันมักจะสนับสนุนให้ผู้อื่นใช้ cygwi ให้มากที่สุด อย่างน้อยก็มีเปลือกทุบตีจริง ปัญหาทั่วไปอื่น ๆ คือบรรจุภัณฑ์เหล่านี้จะสูญเสียการควบคุมและสคริปต์ซ้ำซ้อนจำนวนมากจะปรากฏรอบโครงการของคุณ
บทนำสคริปต์บรรจุภัณฑ์ Run-Java
หากคุณเห็นรหัสของ $ timemachine_home/bin/scheduler.sh คุณจะเห็นว่าจริง ๆ แล้วเรียกว่าสคริปต์ Run-Java ในไดเรกทอรีเดียวกัน
dir = $ (dirname $ 0) scheduler_home = $ dir/run -java -dscheduler.home = "$ scheduler_home" timemachine.tool.tool.dulerserver "" $@"
อย่างที่คุณเห็น Run -Java ของเราสามารถใช้ตัวเลือก -D ไม่เพียงแค่นั้นมันยังสามารถใช้ตัวเลือก -CP! นอกจากนี้คุณสามารถระบุตัวเลือกเหล่านี้ได้หลังคลาสหลัก! สิ่งนี้สามารถทำให้ Run-Java บรรจุโดยสคริปต์อื่น ๆ และยังสามารถเพิ่มแอตทริบิวต์ของระบบและ ClassPath เพิ่มเติมได้
ตัวอย่างเช่น Timemachine มาพร้อมกับห้องสมุด Groovy ดังนั้นคุณสามารถเรียกได้เช่นนี้
Groovy: $ timemachine_home/bin/run-java groovy.groovymain test.groovyโดยไม่ต้องดาวน์โหลดสาขาทั้งหมดอีกครั้ง
คุณสามารถใช้งานได้อย่างง่ายดายในไดเรกทอรีใด ๆ มันยืนยันไดเรกทอรีแล้วโหลดแพ็คเกจ JAR ใด ๆ ในไดเรกทอรี LIB โดยอัตโนมัติ ตอนนี้ถ้าคุณต้องการเพิ่มถุง jar เพิ่มเติมเพื่อเรียกใช้ groovy คุณสามารถใช้ตัวเลือก -CP ได้ดังนี้: ตัวเลือก CP:
$ timemachine_home/bin/run-java -cp "$ home/apps/my-app/lib/*" groovy.groovymain test.groovyโดยปกติหากคุณตั้งค่า Java Classpath คุณมักจะทำให้เกิดข้อผิดพลาดเมื่อคุณไม่ระวัง แต่คุณสามารถเรียกใช้ล่วงหน้าด้วย Run-Java:
run_java_dry = 1 $ timemachine_home/bin/run-java -cp "$ home/apps/my-app/lib/*" groovy.groovymain test.groovy
คุณจะต้องเรียกใช้รหัสบรรทัดด้านบนในบรรทัดพรอมต์คำสั่ง มันจะส่งออกคำสั่ง Java ของตัวเลือกและพารามิเตอร์ทั้งหมดด้วยเอาต์พุตที่สมบูรณ์
Run-Script ยังมีตัวเลือกอื่น ๆ อีกมากมายและคุณสามารถเข้าใจได้ด้วยการดูคำอธิบายประกอบ สคริปต์ปัจจุบันสามารถทำงานใน Linux Bash และ Windows Cygwin
ใช้ Run-Java ผ่าน Maven ในการพัฒนา
ตามตัวอย่างที่กล่าวถึงข้างต้นสมมติว่าโครงสร้างการเปิดตัวโครงการมีดังนี้:
$ timemachine_home +-bin/run-java +-lib/*
แต่ไดเรกทอรีในกระบวนการพัฒนาคืออะไร? กรณีทั่วไปคือ: คุณต้องการเรียกใช้รหัสที่รวบรวมล่าสุดภายใต้เป้าหมาย/คลาสแทนการบรรจุหรือเผยแพร่โครงการทั้งหมด คุณยังสามารถใช้ Run-Java ในกรณีนี้ ก่อนอื่นให้เพิ่ม bin/run-java ในโครงการของคุณแล้วเรียกใช้
MVN Compile Independency: Copy-dependencies
ไฟล์ JAR ทั้งหมดจะถูกสร้างขึ้นภายใต้เป้าหมาย/การพึ่งพา คุณต้องทำสิ่งนี้เท่านั้น Run-Java จะตรวจจับไดเรกทอรีเหล่านี้โดยอัตโนมัติและสร้าง ClassPath ที่ถูกต้องสำหรับคลาสหลักของคุณ
หากคุณใช้ Eclipse เพื่อพัฒนาไดเรกทอรีเป้าหมาย/คลาสของคุณจะได้รับการปรับปรุงเสมอและ Run-Java อาจกลายเป็นสมบัติในการพัฒนาโครงการของคุณ
รับสคริปต์บรรจุภัณฑ์ Run-Java
#!/usr/bin/env bash ## Copyright 2012 Zemian Deng ## ที่ได้รับใบอนุญาตภายใต้ใบอนุญาต Apache, เวอร์ชัน 2.0 ("ใบอนุญาต");# คุณไม่สามารถใช้ไฟล์นี้ได้ตาม Livense# คุณอาจได้รับ a สำเนาใบอนุญาตที่ ## http://www.apache.org/licenses/6license-2.0## จนกว่ากฎหมายที่บังคับใช้หรือตกลงที่จะเป็นลายลักษณ์อักษรซอฟต์แวร์# ed ภายใต้ใบอนุญาตจะถูกแจกจ่ายบน "ตาม" # โดยไม่มีการรับประกันหรือเงื่อนไขใด ๆ ไม่ว่าจะโดยชัดแจ้งหรือบอกเป็นนัย# ดูใบอนุญาตสำหรับการอนุญาตภาษาเฉพาะและการ จำกัด# ations ภายใต้ใบอนุญาต# สคริปต์ wrapper ที่เรียกใช้แอปพลิเคชัน Java6 ใด ๆ ใน Unix/Cygwin Env สคริปต์นี้สันนิษฐานว่าอยู่ในไดเรกทอรี "bin" ของแอปพลิเคชัน # เรียกใช้ที่ใดในระบบไฟล์และจะยังคงอ้างอิงแอปพลิเคชัน# ไดเรกทอรีนี้ ในฐานะ "เป้าหมาย/การทดสอบระดับ",# "เป้าหมาย/คลาส" และ "เป้าหมาย/การพึ่งพา" h ค่าของพา ธ ทั้งหมดควรอยู่ในเส้นทาง Cygwin/Unix,# และสคริปต์นี้จะแปลงเส้นทาง Windows โดยอัตโนมัติที่จำเป็น ตัวเลือก "-CP" ซึ่งจะ postfix ไปยัง classpath ที่มีอยู่ example.hello # example.hello -dname = world # run -java org.junit.runner.junitcore exmple.hellotest -cp "c: /apps/lib/junit4.8.2/*" ## สร้างโดย: Zemian Deng 03/ 09/2012 # สคริปต์รันนี้ D D IR (แก้ไขเส้นทาง Absolute) script_dir = $ (cd $ (dirname $ 0) && pwd) # dir นี้เป็นที่ที่สคริปต์นี้ live.app_dir = $ (cd $ script_dir/.. && pd) # สมมติว่าแอปพลิเคชัน DIR เป็นหนึ่งระดับจากสคริปต์ DIR # พารามิเตอร์เริ่มต้น java_home = $ {java_home: =/apps/jdk} # นี่คือไดเรกทอรีโฮม $ classpathrun_java_opts = $ {run_java_opts: =} # java ตัวเลือก (-xmx512m -xx: maxpermsize = 128m ฯลฯ ) run_java_debug = $ {run_java_debug: =} Ecting แยกวิเคราะห์: =} # ถ้า ไม่ว่างเปล่าข้ามการแยกวิเคราะห์อัตโนมัติของตัวเลือก -D และ -CP จากอาร์กิวเมนต์สคริปต์ run_java_no_autocp = $ {run_java_autocp: =} # ถ้า noty อย่าติดตั้ง java classpathrun_java_dry = $ {run_java_dry: =} Exec Java commit แต่เพียงแค่การสนับสนุนพิเศษ # OS = javaif [-d "$ java_home"]; #Provide Windows Directory Conversion java_home_win = $ (cygpath -aw "$ java_home") app_dir_win = $ (cygpath -aw "$ app_dir") ถ้า [ -d "$ app_dir_win/config"]; /config "; fi ถ้า [-d" $ app_dir_win/target/test -classes "]; จากนั้น run_java_cp =" $ run_java_cp; คลาส "]; run_java_cp =" $ run_java_cp; "]; จากนั้น run_java_cp =" $ run_java_cp; ; -classes "; fi ถ้า [-d" $ app_dir/target/classes "]; run_java_cp =" $ run_java_cp: $ app_dir/target/class "; run_java_cp =" $ run_java_cp: $ app_dir/เป้าหมาย ; ส่งออก run_java_cp และ run_java_opts# ey สามารถผ่านไปยังจุดสิ้นสุดของสคริปต์ run-java นี้แทน# สิ่งนี้สามารถปิดการใช้งานได้โดย self_java_parse = 1. ถ้า -z "$ run_java_no_parse" idx = 0 # แยกอาร์กิวเมนต์ทั้งหมดและค้นหา "-cp" และ "สำหรับ arg ใน" $@ "; ทำถ้า [[-n $ found_cp]]; ถ้า [" $ os "=" windows_nt "]; ไม่สามารถใช้ CygPath ได้ที่นี่เพราะ CygPath จะขยายตัว "*" ซึ่งเราไม่ต้องการ # $ arg) run_java_cp = "$ run_java_cp; p =" $ run_java_cp: $ arg "fi found_cp = กรณีอื่น $ arg ใน '-cp') found_cp = 1; '-d' *) run_java_opts =" $ run_java_opts $ arg "; *) new_args [$ idx] = "$ arg" lee t idx = $ idx +1 ;; esac fi เสร็จสิ้น # display คำสั่ง Java เต็ม จากนั้นสะท้อน "$ java_cmd" $ run_java_opts -cp "" $ run_java_cp "" $ {new_args [@]} -cp "$ run_java_cp" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ] || [-n "$ run_java_dry"]; "$ java_cmd" $ run_java_opts -cp "$ run_java_cp" "$@" Fifi