2010-01-15 36 views
7

dự án của chúng tôi trong nhật thực xấp xỉ cho thấy các thư mục sau:Eclipse: xuất khẩu sang .jar VÀ bao gồm các file tài nguyên (ANT)

application 
    - src 
    - JRE System Library [1.6] 
    - Referenced Libraries 
    - lib 
    - rsc 

Trong dự án của chúng tôi, chúng tôi muốn sử dụng File> Export ...> Executable JAR

Điều đó có hiệu quả, với một số ngoại lệ: Nếu chúng ta muốn chạy application.jar của mình, chúng ta vẫn cần phải sao chép thư mục rsc/trong cùng một vị trí như application.jar.

Trong rsc /, chúng tôi có các thư mục khác để tách các phần khác nhau. Về cơ bản, chúng ta nạp các mảnh bằng cách sử dụng mã (cũng một chút thay đổi, nhưng phong cách đường là đúng)

strUrl = "file:rsc/properties/Constants.properties"; 
url = new URL(strUrl); 
ImageIcon icon = new ImageIcon(url); 

tôi có thể click chuột phải vào rsc /> Build Path> Use as Source Folder.

Nhưng điều này không hoạt động vì eclipse không tự động sao chép thư mục rsc vào thùng/thư mục. Và sau đó chúng tôi không thể chạy nó nữa từ thiết bị đầu cuối (không được đóng gói vào bình)

EDIT: tại sao nhật thực không thể xử lý chính xác? Tại sao nó có vấn đề với thư mục đầu ra "lồng nhau"? Trong tab Source của hộp thoại Build Path, tôi có thể dễ dàng thêm rsc/-folder với thư mục đầu ra được đặt vào bin/rsc /, nhưng dường như không thể đặt các thư mục lồng nhau ...


CHỈNH SỬA 2: Bây giờ tôi đã có thể tạo tệp xml để tạo nội dung với kiến ​​và bằng cách nào đó được quản lý để đưa thư mục rsc vào trong bình. Vẫn không chạy do lỗi tương tự. Tôi có thực sự cần phải kiểm tra các đường dẫn tài nguyên cho dù họ đang ở trong một JAR hay không? nội dung của JAR tại là những điều sau đây:

META-INF/ 
META-INF/MANIFEST.MF 
configurator/ 
controller/ 
editor/ 
gui/ 
logic/ 
networking/ 
rsc/ 
rsc/gamesettings/ 
rsc/levels/ 
rsc/pics/ 
rsc/properties/ 
util/ 

nhưng Java vẫn ghét tôi và ném java.io.FileNotFoundException: rsc/properties/Constants.properties với một stacktrace khoảng 100 dòng.


bất kỳ ai có ý tưởng cách thực hiện? thx & liên quan

Trả lời

15

Nếu bạn đánh dấu rsc như một thư mục nguồn Eclipse sẽ sao chép nội dung của nó vào thư mục đầu ra. Hoặc bạn chỉ có thể di chuyển rsc dưới src nếu bạn muốn nhóm các tài nguyên trong đầu ra.

Sau đó, bạn có thể sử dụng Class.getResource("/properties/Constants.properties") hoặc Class.getResource("/rsc/properties/Constants.properties") và nó sẽ hoạt động bất kể ứng dụng của bạn được đóng gói dưới dạng bình hay chạy từ nguồn.

Là một sidenote, giao thức file: chỉ hoạt động với các tệp thông thường, để truy cập các tệp trong jar bạn phải sử dụng một cái gì đó như new URL("jar:file:app.jar!/rsc/properties/Constants.properties").

+0

Có. Đây là giải pháp, nhưng đánh dấu rsc/như src-thư mục trong nhật thực không thực hiện công việc. Một sinh viên khác dẫn tôi đến cùng một giải pháp. Vấn đề là chúng ta phải sử dụng Class.getResource ("..."), đường dẫn được thêm vào trước với một '/'. thx và kính trọng – Atmocreations

+0

Xin lỗi, ý bạn là gì bởi 'Class # getResource()'? Không có phương thức tĩnh như vậy trong lớp 'Class'. – m0skit0

+0

@ m0skit0 Phương pháp này không tĩnh, xin lỗi vì sự nhầm lẫn. –

2

Đối với loại sử dụng này, tôi sẽ recommand sử dụng Maven, tự động thực hiện điều đó khi tạo bình. Thậm chí còn có an Eclipse plugin.

Bạn cũng có thể sử dụng Ant.

+0

thx, tôi biết rằng loại công cụ này tồn tại. Nhưng tôi không có kinh nghiệm với họ và ý kiến ​​của tôi là nếu nhật thực cung cấp một công cụ để tạo jar thực thi, tôi đoán có thể chỉ cần thêm một thư mục khác vào bình mà không sửa đổi nó. – Atmocreations

4

Bạn có thể thử: Trong hộp thoại Đường dẫn xây dựng Java, hãy chuyển đến tab Thư viện và chọn "Thêm thư mục lớp ...". Chọn rsc từ hộp thoại Lựa chọn thư mục lớp. Nội dung của thư mục rsc bây giờ sẽ được bao gồm trong tệp jar thực thi.

(Lưu ý rằng rsc bản thân sẽ không được bao gồm, vì vậy bạn có thể phải thêm một thư mục con mới theo rsc để làm cho cấu trúc thư mục trong jar bên phải.)

+0

thx cho câu trả lời của bạn. Vâng vâng, điều đó sẽ hiệu quả. Nhưng vấn đề là tôi không thể di chuyển các đối tượng này vào rsc/rsc/bởi vì chạy cục bộ (không tạo tệp jar) sẽ không hoạt động nữa ... – Atmocreations

1

Tôi làm điều này thường bằng tay, trong trường hợp của bạn jar -uf foo.jar rsc bao gồm tất cả các tài nguyên của bạn. Bạn có thể viết một kịch bản hay làm điều này trong kiến ​​

1

Như bạn nói trong Chỉnh sửa 2 rằng bạn có tất cả trong một lọ, điều này sẽ làm việc:

String path = "rsc/img/img.gif"; 
URL url = this.getClass().getResource(path); 
ImageIcon icon = new ImageIcon(url); 
+0

Cảm ơn phản hồi của bạn. Tôi phải nói rằng "this.getClass()" nằm ở src/util/ Sẽ thử nó – Atmocreations

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