2012-08-03 32 views
7

Tôi đã tạo mô-đun mới cho phần mềm được viết bằng java. Phần mềm này được chạy từ các tệp jar. Các lớp của tôi đang mở rộng các lớp trong phần mềm này. Tôi muốn viết một plugin bổ sung thêm các lớp mới vào tệp jar. Tôi biết cách trích xuất một tệp jar vào thư mục và thêm chúng vào tệp jar bằng cách sử dụng gói java.util.jar nhưng vì có rất nhiều tệp để trích xuất từ ​​tệp, nên có thể thêm các lớp mới mà không cần giải nén tệp vào thư mục, bằng cách nào đó trực tiếp.Cách thêm các lớp Java mới vào các lớp hiện có trong tệp jar

+1

Tôi được nhắc về việc sửa đổi minecraft. Ngoài sự tò mò, bạn có viết phần mềm này mà bạn đang cố gắng mở rộng không? Có nhiều cách tốt hơn để làm điều đó trong trường hợp đó, bằng cách sử dụng tải lớp động. – Wug

+0

Không cần sửa đổi tệp jar hiện có. Chỉ cần đặt các lớp trong lọ của riêng mình và đảm bảo cả hai lọ đều nằm trên đường dẫn lớp. –

+0

Có thể trùng lặp bởi cùng một người dùng: http://stackoverflow.com/questions/11852954/changing-code-at-runtime-in-java –

Trả lời

4
jar uf jar-file input-file(s) 

Sẽ cho phép thêm new files/update các tệp hiện có trong bình mà không giải nén.

12

Bạn có thể sử dụng lệnh sau

jar uf foo.jar foo.class 
+0

Điều này chỉ hoạt động 50% vì lệnh đó sẽ không đặt lớp trong gói tương ứng của nó cấu trúc cây. – m0skit0

+2

@ m0skit0 Để đặt lớp học trong cấu trúc tres bạn cần phải vượt qua tên lớp với cấu trúc thư mục. jar uf foo.jar /com/test/foo.class –

4

Câu hỏi của bạn cho thấy rằng bạn muốn làm điều này lập trình, không bằng cách sử dụng dòng lệnh jar công cụ.

Từ các tài liệu có vẻ như bạn sẽ ít nhất cần phải có được một JarInputStream từ một hiện JarFile, lặp qua các mục sử dụng getNextJarEntry, và ghi vào một JarOutputStream với các mục, cũng thêm các tập tin mới của riêng bạn sử dụng mới JarEntry đối tượng cho mỗi tệp mới.

Here's mã mẫu để viết bình từ đầu lập trình, điều này sẽ mở rộng độc đáo với trường hợp của bạn, sự khác biệt là hầu hết các đối tượng JarEntry sẽ đến từ JarInputStream.

Các vấn đề liên quan