Chúng tôi có tệp JAR thực thi đôi khi chứa các tệp JAR khác. (. Toàn bộ điều dựa trên bốn lọ tải khác, cưỡi trên lưng một con rùa triển khai khổng lồ trong không gian) Khi chạy, chúng tôi tự động tải tập tin JAR lồng nhau cách làm như sau:Trình nạp lớp của Java so với các bình trong jars
// wearyingly verbose error handling elided
URL nestedURL = the_main_system_classloader.getResource("path/to/nested.jar");
File temp = File.createTempFile (....);
// copy out nestedURL contents into temp, byte for byte
URL tempURL = temp.toURI().toURL();
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{ tempURL });
Class<?> clazz = loader.loadClass("com.example.foo.bar.baz.Thing");
Thing thing = (Thing) clazz.newInstance();
// do stuff with thing
này loại kỹ thuật có được đưa lên đây trước đây; các liên kết bao gồm this one và this one. Mã chúng tôi hiện đang có tại nơi làm việc ...
... chủ yếu. Tôi thực sự muốn tìm một số cách để tránh việc tạo và sao chép tệp tạm thời (và cuối cùng là dọn dẹp, vì như chúng ta đều biết, deleteOnExit is evil). URL thu được ngay tại điểm bắt đầu cho một JAR, sau cùng là:
URL nestedURL = the_main_system_classloader.getResource("path/to/nested.jar");
// nestedURL.toString() at this point is
// "jar:file:/C:/full/path/to/the/executable.jar!/path/to/nested.jar"
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{ nestedURL });
Class<?> clazz = loader.loadClass("com.example.foo.bar.baz.Thing");
Nhưng loadClass ném ClassNotFound.
Trình tải URLClassLoader có thể không xử lý trường hợp JAR-trong-một-JAR này không? Hay tôi cần phải làm điều gì đó cho một hoặc nhiều đường dẫn liên quan (hoặc nestedURL hoặc chuỗi được truyền tới loadClass) để thực hiện công việc này?
Tôi có thể sử dụng điều này để tạo một bình đơn - http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html. –
Bạn đã thử 'addUrl' vào trình nạp lớp chính rồi tải lớp bình thường chưa? – assylias
@PaulGrime Thật không may, việc cấp phép cho phép chúng tôi chỉ phân phối lại các tệp jar lồng nhau, nhưng không giải nén/đóng gói lại chúng. –