Sửa đổi tệp bên trong bình


87

Tôi muốn sửa đổi một tệp bên trong lọ của tôi. Có thể làm điều này mà không cần giải nén và gây chói tai, từ trong ứng dụng của tôi không?

Tệp tôi muốn sửa đổi là tệp cấu hình, chủ yếu dựa trên xml.

Lý do tôi quan tâm đến việc không bị chói tai là ứng dụng được bao bọc bởi launcher4j nếu tôi mở nó ra thì tôi không thể tạo lại tệp .exe.


1
tôi muốn giữ các tệp bổ sung trong ứng dụng mà không tạo tệp tạm thời trên hệ thống tệp.
Hamza Yerlikaya

Hãy thử giải pháp này stackoverflow.com/a/4837522/1853864 mà tôi đã sử dụng và các vấn đề của tôi đã được giải quyết.
A. Magalhães

Bạn có thể vui lòng không chấp nhận câu trả lời được chấp nhận hiện tại không? Nó có một số điểm tiêu cực và là hoàn toàn không hữu ích
Dici

Câu trả lời:


83

Bạn có thể sử dụng utùy chọn chojar

Từ Hướng dẫn Java:

jar uf jar-file input-file(s)

"Bất kỳ tệp nào đã có trong kho lưu trữ có cùng tên đường dẫn với tệp đang được thêm vào sẽ bị ghi đè."

Xem Cập nhật tệp JAR .

Tốt hơn nhiều so với việc làm lại toàn bộ lọ. Lời mời này từ trong chương trình của bạn cũng có vẻ khả thi. Thử chạy dòng lệnh trong Java


Tuyệt vời! Nhưng họ đã thêm các tên đường dẫn vui nhộn. IE Bitbucket.foo.bar thay vì com.etc.etc hiện có
StarWind0

26

Bạn có thể sử dụng Vim:

vim my.jar

Vim có thể chỉnh sửa các tệp văn bản nén mà bạn có unziptrong môi trường của mình.


3
Điều đó thật tuyệt. Điều hướng đến tệp bạn đang tìm kiếm và nhấn Enter. Chỉnh sửa tệp, sau đó gõ: wq để lưu!
Michael Butler

Ngoài ra, bạn cần ziptrong môi trường của mình, để có thể lưu các thay đổi. Cảm ơn vì câu trả lời!
troig

11

Các tệp jar Java có cùng định dạng với tệp zip - vì vậy nếu bạn có một tiện ích tệp zip cho phép bạn sửa đổi tệp lưu trữ, thì bạn đã sẵn sàng. Vấn đề thứ hai là, nếu bạn muốn biên dịch lại một lớp hoặc một cái gì đó, bạn có thể sẽ phải xây dựng lại jar; nhưng một tệp văn bản hoặc một cái gì đó (ví dụ: xml) phải dễ dàng được sửa đổi.


8

Như nhiều người đã nói, bạn không thể thay đổi tệp trong JAR mà không cần chỉnh lại JAR. Nó thậm chí còn tồi tệ hơn với Launch4J, bạn phải xây dựng lại EXE khi bạn thay đổi JAR. Vì vậy, đừng đi con đường này.

Nói chung, việc đặt các tệp cấu hình trong JAR là một ý tưởng tồi. Đây là gợi ý của tôi. Tìm kiếm tệp cấu hình của bạn ở một số vị trí được xác định trước (như thư mục chính, \ Program Files \ etc). Nếu bạn tìm thấy một tệp cấu hình, hãy sử dụng nó. Nếu không, hãy sử dụng một trong JAR làm dự phòng. Nếu bạn làm điều này, bạn chỉ cần ghi tệp cấu hình vào vị trí được xác định trước và chương trình sẽ nhận nó.

Một lợi ích khác của phương pháp này là tệp cấu hình đã sửa đổi sẽ không bị ghi đè nếu bạn nâng cấp phần mềm của mình.



2

Đây có thể là công việc nhiều hơn bạn đang tìm cách giải quyết trong ngắn hạn, nhưng tôi nghĩ về lâu dài sẽ rất có lợi cho bạn khi xem xét sử dụng Ant (hoặc Maven , hoặc thậm chí là Bazel ) thay vì xây dựng bình thủ công . Bằng cách đó, bạn có thể chỉ cần nhấp vào tệp kiến ​​(nếu bạn sử dụng Eclipse) và xây dựng lại bình.

Ngoài ra, bạn có thể muốn thực sự không có các tệp cấu hình này trong jar - nếu bạn muốn thay thế các tệp này thường xuyên hoặc nếu nó được phân phối cho nhiều bên, tệp cấu hình không nên là một phần của cái lọ.


2
Đã đồng ý. Tuy nhiên, bạn có thể muốn đặt tệp cấu hình "mặc định" trong JAR, vì vậy nếu có điều gì đó xảy ra với tệp bên ngoài (bị hỏng, bị xóa, v.v.), bạn có thể quay lại cấu hình mặc định.
Thomas Owens

True - mặc dù tôi không biết có bao nhiêu ứng dụng sẽ tiếp tục hoạt động mà không cần các file cấu hình của họ ...
dimo414

1

Để mở rộng những gì dfa đã nói, lý do là vì tệp jar được thiết lập giống như tệp zip. Nếu bạn muốn sửa đổi tệp, bạn phải đọc tất cả các mục nhập, sửa đổi mục bạn muốn thay đổi, sau đó ghi các mục nhập trở lại tệp jar. Tôi đã phải làm điều này trước đây, và đó là cách duy nhất tôi có thể tìm thấy để làm điều đó.

BIÊN TẬP

Lưu ý rằng điều này đang sử dụng trình chỉnh sửa tệp jar nội bộ của Java, là các luồng tệp. Tôi chắc chắn rằng có một cách để làm điều đó, bạn có thể đọc toàn bộ jar vào bộ nhớ, sửa đổi mọi thứ, sau đó ghi lại vào một luồng tệp. Đó là những gì tôi tin rằng các tiện ích như 7-Zip và những tiện ích khác đang làm, vì tôi tin rằng ToC của tiêu đề zip phải được xác định tại thời điểm ghi. Tuy nhiên, tôi có thể sai.


1

Có, bạn có thể, bằng cách sử dụng SQLite, bạn có thể đọc hoặc ghi vào cơ sở dữ liệu từ bên trong tệp jar, do đó bạn sẽ không phải giải nén và sau đó ghi lại nó, hãy làm theo bài đăng của tôi http://shoaibinamdar.in/blog/? p = 313

sử dụng cú pháp "jdbc: sqlite :: resource:" bạn sẽ có thể đọc và ghi vào cơ sở dữ liệu từ trong tệp jar


1
Xin chào, chào mừng bạn đến với stackoverflow. Tôi đã xóa các từ viết tắt khỏi bài đăng của bạn. Nói chung, kiểu viết tắt của tin nhắn văn bản không thích hợp ở đây. Tôi nghĩ câu trả lời này sẽ là một câu trả lời tốt cho câu hỏi nếu bạn bao gồm thêm một số chi tiết từ blog của mình, trong chính câu trả lời để ai đó đọc câu trả lời của bạn học được điều gì đó ngay cả khi họ không đọc blog hoặc nó bị di chuyển đến một URL khác vào một ngày nào đó trong tương lai.
Flexo

1

Kiểm tra TrueZip .

Nó thực hiện chính xác những gì bạn muốn (chỉnh sửa tệp nội tuyến bên trong tệp jar), thông qua API hệ thống tệp ảo. Nó cũng hỗ trợ các kho lưu trữ lồng nhau (bình bên trong bình).


1

Giải nén tệp jar cho ví dụ. với winrar và sử dụng CAVAJ:

Cavaj Java Decompiler là một tiện ích phần mềm miễn phí đồ họa giúp tái tạo lại mã nguồn Java từ các tệp CLASS.

đây là video hướng dẫn nếu bạn cần: https://www.youtube.com/watch?v=ByLUeem7680


tốt, "Sử dụng phần mềm CAVAJ" là câu trả lời ở đây. Liên kết chỉ là bổ sung nếu cần giải thích thêm.
Tomasz Mularczyk

0

Miễn là tệp này không phải .class, tức là tệp tài nguyên hoặc tệp kê khai - bạn có thể.


và làm thế nào, mà không cần giải nén và làm chói tai?
user85421

0

Cách đơn giản nhất mà tôi đã tìm thấy để làm điều này trong Windows là với WinRAR :

  1. Nhấp chuột phải vào tệp và chọn "Mở bằng WinRAR" từ trình đơn ngữ cảnh.
  2. Điều hướng đến tệp cần chỉnh sửa và nhấp đúp vào tệp để mở tệp trong trình chỉnh sửa mặc định.
  3. Sau khi thực hiện các thay đổi, hãy lưu và thoát khỏi trình chỉnh sửa.
  4. Sau đó, một hộp thoại sẽ xuất hiện hỏi bạn có muốn cập nhật tệp trong kho lưu trữ hay không - chọn "Có" và JAR sẽ được cập nhật.

0

hầu hết các câu trả lời ở trên nói rằng bạn không thể làm điều đó cho tệp lớp.

Ngay cả khi bạn muốn cập nhật tệp lớp, bạn cũng có thể làm điều đó. Tất cả những gì bạn cần làm là kéo và thả tệp lớp từ không gian làm việc của bạn vào jar.

Trong trường hợp bạn muốn xác minh các thay đổi của mình trong tệp lớp, bạn có thể thực hiện bằng cách sử dụng trình dịch ngược như jd-gui.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.