การแก้ไขไฟล์ภายใน jar


88

ฉันต้องการแก้ไขไฟล์ในขวดโหลของฉัน เป็นไปได้หรือไม่ที่จะทำสิ่งนี้โดยไม่ต้องดึงข้อมูลและสร้างความเสียหายจากภายในแอปพลิเคชัน

ไฟล์ที่ฉันต้องการแก้ไขเป็นไฟล์คอนฟิกูเรชันซึ่งส่วนใหญ่ใช้ xml

เหตุผลที่ฉันสนใจที่จะไม่ยกเลิกการหยุดชะงักคือแอปพลิเคชันถูกห่อด้วย launch4j หากฉันไม่ได้รับการเข้ารหัสฉันจะไม่สามารถสร้างไฟล์. exe ได้อีก


1
ฉันต้องการเก็บไฟล์เสริมไว้ในแอปพลิเคชันโดยไม่ต้องสร้างไฟล์ชั่วคราวในระบบไฟล์
Hamza Yerlikaya

ลองใช้วิธีนี้stackoverflow.com/a/4837522/1853864 ที่ ฉันใช้และปัญหาของฉันได้รับการแก้ไขแล้ว
อ. Magalhães

คุณช่วยยกเลิกการยอมรับคำตอบที่ยอมรับในปัจจุบันได้ไหม มีคะแนนติดลบและไม่เป็นประโยชน์อย่างยิ่ง
Dici

คำตอบ:


84

คุณสามารถใช้uตัวเลือกสำหรับjar

จากบทแนะนำ Java:

jar uf jar-file input-file(s)

"ไฟล์ใด ๆ ที่อยู่ในที่เก็บถาวรซึ่งมีชื่อพา ธ เหมือนกับไฟล์ที่เพิ่มจะถูกเขียนทับ"

ดูการอัพเดต JAR ไฟล์

ดีกว่าทำทั้งกระปุกใหม่ทั้งหมด การเรียกใช้สิ่งนี้จากภายในโปรแกรมของคุณก็เป็นไปได้เช่นกัน ลองรัน Command Line ใน Java


สุดยอด! แต่พวกเขาเพิ่มชื่อพา ธ ให้ตลก IE Bitbucket.foo.bar แทน com.etc.etc ที่มีอยู่
StarWind0

26

คุณสามารถใช้ Vim:

vim my.jar

Vim สามารถแก้ไขไฟล์ข้อความที่บีบอัดได้ตามที่คุณมีunzipในสภาพแวดล้อมของคุณ


3
นี่มันเยี่ยมมาก ไปที่ไฟล์ที่คุณต้องการแล้วกด Enter แก้ไขไฟล์แล้วพิมพ์: wq เพื่อบันทึก!
Michael Butler

นอกจากนี้คุณต้องzipอยู่ในสภาพแวดล้อมของคุณเพื่อให้สามารถบันทึกการเปลี่ยนแปลงได้ ขอบคุณสำหรับคำตอบ!
Troig

11

ไฟล์ Java jar เป็นรูปแบบเดียวกับไฟล์ zip ดังนั้นหากคุณมียูทิลิตี้ไฟล์ zip ที่จะช่วยให้คุณแก้ไขไฟล์เก็บถาวรได้คุณต้องเท้าเข้าประตู ปัญหาที่สองคือถ้าคุณต้องการคอมไพล์คลาสหรือบางอย่างใหม่คุณอาจจะต้องสร้างไหขึ้นมาใหม่ แต่ไฟล์ข้อความหรือบางอย่าง (ตัวอย่างเช่น xml) ควรจะแก้ไขได้ง่ายพอสมควร


8

อย่างที่หลาย ๆ คนบอกคุณไม่สามารถเปลี่ยนไฟล์ใน JAR ได้โดยไม่ต้องทำ JAR ใหม่ มันแย่ยิ่งกว่ากับ Launch4J คุณต้องสร้าง EXE ใหม่เมื่อคุณเปลี่ยน JAR ดังนั้นอย่าไปเส้นทางนี้

โดยทั่วไปเป็นความคิดที่ดีที่จะใส่ไฟล์การกำหนดค่าใน JAR นี่คือคำแนะนำของฉัน ค้นหาไฟล์คอนฟิกูเรชันของคุณในตำแหน่งที่กำหนดไว้ล่วงหน้า (เช่นโฮมไดเร็กทอรี \ Program Files \ ฯลฯ ) หากคุณพบไฟล์กำหนดค่าให้ใช้ มิฉะนั้นให้ใช้อันใน JAR เป็นทางเลือก หากคุณทำเช่นนี้คุณเพียงแค่ต้องเขียนไฟล์คอนฟิกูเรชันในตำแหน่งที่กำหนดไว้ล่วงหน้าจากนั้นโปรแกรมจะรับมัน

ข้อดีอีกอย่างของวิธีนี้คือไฟล์คอนฟิกูเรชันที่แก้ไขจะไม่ถูกเขียนทับหากคุณอัปเกรดซอฟต์แวร์


4

ไม่แน่ใจว่าช่วยได้หรือไม่ แต่คุณสามารถแก้ไขได้โดยไม่ต้องแตกไฟล์:

  1. เปิดไฟล์ jar จากตัวแก้ไข vi
  2. เลือกไฟล์ที่คุณต้องการแก้ไขจากรายการ
  3. กด Enter เพื่อเปิดไฟล์ทำการเปลี่ยนและบันทึกค่อนข้างง่าย

ตรวจสอบบล็อกโพสต์สำหรับรายละเอียดเพิ่มเติม http://vinurip.blogspot.com/2015/04/how-to-edit-contents-of-jar-file-on-mac.html


2

นี่อาจจะได้ผลมากกว่าที่คุณต้องการจัดการในระยะสั้น แต่ฉันสงสัยว่าในระยะยาวมันจะเป็นประโยชน์อย่างมากสำหรับคุณที่จะพิจารณาใช้Ant (หรือMavenหรือแม้แต่Bazel ) แทนการสร้างโถด้วยตนเอง . ด้วยวิธีนี้คุณสามารถคลิกที่ไฟล์ ant (ถ้าคุณใช้ Eclipse) และสร้าง jar ขึ้นมาใหม่

หรือคุณอาจต้องการไม่มีไฟล์กำหนดค่าเหล่านี้ใน jar เลย - หากคุณคาดว่าจะต้องเปลี่ยนไฟล์เหล่านี้เป็นประจำหรือหากควรแจกจ่ายให้กับหลายฝ่ายไฟล์ config ไม่ควรเป็นส่วนหนึ่งของ โถเลย


2
ตกลง อย่างไรก็ตามคุณอาจต้องการใส่ไฟล์คอนฟิกูเรชัน "ค่าเริ่มต้น" ใน JAR ดังนั้นหากมีสิ่งใดเกิดขึ้นกับไฟล์ภายนอก (เสียหายถูกลบ ฯลฯ ) คุณสามารถกลับไปใช้การกำหนดค่าเริ่มต้นได้
Thomas Owens

จริง - แม้ว่าฉันจะไม่รู้ว่ามีแอปพลิเคชั่นกี่ตัวที่จะทำงานต่อไปโดยไม่มีไฟล์คอนฟิก ...
dimo414

1

หากต้องการขยายสิ่งที่ dfa กล่าวสาเหตุเป็นเพราะไฟล์ jar ถูกตั้งค่าเหมือนไฟล์ zip หากคุณต้องการแก้ไขไฟล์คุณต้องอ่านรายการทั้งหมดแก้ไขรายการที่คุณต้องการเปลี่ยนแปลงจากนั้นเขียนรายการกลับลงในไฟล์ jar ฉันต้องทำสิ่งนี้มาก่อนและนั่นเป็นวิธีเดียวที่ฉันสามารถทำได้

แก้ไข

โปรดทราบว่าสิ่งนี้กำลังใช้ตัวแก้ไขไฟล์ jar ภายในถึง Java ซึ่งเป็นไฟล์สตรีม ฉันแน่ใจว่ามีวิธีทำคุณสามารถอ่าน jar ทั้งหมดลงในหน่วยความจำแก้ไขทุกอย่างจากนั้นเขียนกลับไปที่สตรีมไฟล์ นั่นคือสิ่งที่ฉันเชื่อว่ายูทิลิตี้เช่น 7-Zip และอื่น ๆ กำลังทำอยู่เนื่องจากฉันเชื่อว่าต้องมีการกำหนด ToC ของส่วนหัว zip ในเวลาเขียน อย่างไรก็ตามฉันคิดผิด


1

ใช่คุณสามารถใช้ SQLite คุณสามารถอ่านหรือเขียนไปยังฐานข้อมูลจากภายในไฟล์ jar เพื่อที่คุณจะได้ไม่ต้องแตกไฟล์แล้วทำการ jar ใหม่ตามโพสต์ของฉันhttp://shoaibinamdar.in/blog/? p = 313

โดยใช้ไวยากรณ์ "jdbc: sqlite :: resource:" คุณจะสามารถอ่านและเขียนไปยังฐานข้อมูลจากภายในไฟล์ jar


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

1

ตรวจสอบTrueZip

มันทำสิ่งที่คุณต้องการ (เพื่อแก้ไขไฟล์แบบอินไลน์ภายในไฟล์ jar) ผ่าน API ระบบไฟล์เสมือน นอกจากนี้ยังรองรับไฟล์เก็บถาวรที่ซ้อนกัน (jar inside a jar) ด้วย


1

แตกไฟล์ jar สำหรับ ex. ด้วย winrar และใช้ CAVAJ:

Cavaj Java Decompiler เป็นยูทิลิตี้ฟรีแวร์แบบกราฟิกที่สร้างซอร์สโค้ด Java ใหม่จากไฟล์ CLASS

นี่คือวิดีโอสอนหากคุณต้องการ: https://www.youtube.com/watch?v=ByLUeem7680


ซอฟต์แวร์ "ใช้ CAVAJ" คือคำตอบที่นี่ ลิงค์เป็นเพียงส่วนเสริมหากต้องการคำอธิบายเพิ่มเติม
Tomasz Mularczyk

0

ตราบเท่าที่ไฟล์นี้ไม่ใช่. class นั่นคือไฟล์ทรัพยากรหรือไฟล์รายการ - คุณสามารถทำได้


และวิธีการโดยไม่ต้องแยกและเขย่าซ้ำ?
user85421

0

วิธีที่ง่ายที่สุดที่ฉันพบใน Windows คือใช้WinRAR :

  1. คลิกขวาที่ไฟล์และเลือก "Open with WinRAR" จากเมนูบริบท
  2. ไปที่ไฟล์ที่จะแก้ไขและดับเบิลคลิกเพื่อเปิดในโปรแกรมแก้ไขเริ่มต้น
  3. หลังจากทำการเปลี่ยนแปลงแล้วให้บันทึกและออกจากโปรแกรมแก้ไข
  4. จากนั้นกล่องโต้ตอบจะปรากฏขึ้นถามว่าคุณต้องการอัปเดตไฟล์ในที่เก็บถาวรหรือไม่ - เลือก "ใช่" จากนั้น JAR จะได้รับการอัปเดต

0

คำตอบส่วนใหญ่ข้างต้นบอกว่าคุณไม่สามารถใช้กับไฟล์คลาสได้

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

ในกรณีที่คุณต้องการตรวจสอบการเปลี่ยนแปลงของไฟล์คลาสคุณสามารถทำได้โดยใช้ตัวถอดรหัสเช่น jd-gui

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.