2011-11-28 29 views
5

Nếu tôi có một dự án java bao gồm một số loại tệp khác nhau (hình ảnh, âm thanh, v.v.) và nhiều phụ thuộc jar, cách tốt nhất để gói tất cả vào một cái bình chỉ có thể được nhấp đúp?tạo một ứng dụng java đơn lẻ

Tôi biết các bình của mình khá ngu ngốc vì chúng không nhìn vào bên trong các tệp mà chúng phụ thuộc vào (cái mà tôi chỉ nhận ra sau một chút thất vọng (nói cách)). - Nếu bình A phụ thuộc vào các lớp chứa trong bình B, thì đặt bình B vào bình A sẽ không hoạt động. Jar A phải nằm trong cùng một thư mục như jar B.

... Bây giờ, tôi biết tôi có thể trích xuất tất cả các tệp từ tất cả các lọ khác và đặt tất cả mọi thứ trong cùng một thư mục. Điều đó sẽ loại công việc, nhưng tôi không muốn làm điều đó bởi vì: 1. Nó sẽ là lộn xộn và 2. nó vẫn sẽ không giải quyết được vấn đề cần phải có các tập tin âm thanh trong cùng một thư mục như là cuối cùng jar. (Vì lý do gì đó, các tập tin âm thanh hoạt động giống hệt như các lọ bên trong)

Về cơ bản, tôi chỉ muốn làm cho các tập tin mà ứng dụng của tôi phụ thuộc không hiển nhiên và phô trương. Vì vậy, nếu có một số giải pháp mà tôi có thể đặt tất cả mọi thứ bên trong một cái lọ và có nó là tập tin cần thiết duy nhất để chạy toàn bộ chương trình, đó sẽ là tối ưu. Nhưng, tôi sẵn sàng chấp nhận các cách sáng tạo/sáng tạo để bỏ qua vấn đề, chẳng hạn như có một tập lệnh batch trong thư mục cha thực hiện jar hoặc một cái gì đó. (Tôi nói "hoặc một cái gì đó" vì kịch bản chính xác đó sẽ chỉ hoạt động trên các hệ điều hành windows. ... bạn biết ý tôi là gì!)

+0

cách bạn truy cập vào tài nguyên của mình (tệp âm thanh, v.v ...)? dưới dạng tệp hoặc như getResource()? –

+0

Tôi đang chuyển tên tệp của họ vào đối tượng Tệp – Pojo

Trả lời

2

Bạn có thể trích xuất tất cả các JAR và kết hợp chúng thành một JAR chung. Có các tác vụ ANT và các plugin Maven sẵn sàng để thực hiện việc này. Ngoài ra, nếu ứng dụng của bạn được viết đúng cách, không có gì ngăn cản bạn đặt các tệp phương tiện và các tài nguyên khác trong JAR. Bạn chỉ cần đảm bảo rằng các tài nguyên này là "loaded from the classpath", thay vì được tải từ thư mục làm việc hiện tại.

+0

Làm cách nào tôi ... "tải từ đường dẫn lớp", chính xác? Tôi đang sử dụng 2 phương pháp chơi âm thanh; một là jmf, chấp nhận các tệp âm thanh như một đối tượng URL, và một là Clip, chấp nhận các tệp âm thanh như đối tượng Tệp – Pojo

+0

Bạn có thể bao gồm một số tên gói/lớp tuyệt đối không? javax.sound.sampled.Clip cung cấp phương thức mở (dòng AudioInputStream), có thể được khởi tạo bằng cách sử dụng InputStream thông thường - chẳng hạn như phương thức được cung cấp bởi getResourceAsStream(). – ziesemer

+0

Vâng, sẽ không sử dụng một tên đường dẫn tuyệt đối được khá xấu ..? Bởi vì sau đó tất cả những gì bạn phải làm là di chuyển cái lọ ở đâu đó khác, và đột nhiên nó không hoạt động nữa. ... Và chắc chắn, Clip có thể làm điều đó, vì vậy tôi đoán tôi sẽ thử ngay bây giờ, nhưng với jmf, javax.media.Manager chỉ có thể tạo Người chơi từ DataSources, MediaLocators và URL. Điều gì về điều đó? – Pojo

1

Nếu bạn sử dụng plugin lắp ráp cho maven, bạn có thể tải xuống phụ thuộc, tạo mô-đun và tạo một tệp thực thi.

1

Nếu bạn đang xây dựng một bình thực thi và có các lọ khác mà bạn cần có sẵn trong đường dẫn lớp, có một đường dẫn lớp: trong tệp MANIFEST.MF của jar liệt kê các mục (bao gồm các lọ và thư mục) để đưa vào classpath khi lớp chính được chạy.

Tôi thường sử dụng IDE hoặc kiến ​​của mình để tạo các tệp thi hành như vậy và đặt tiêu đề Class-Path:.

Nhân tiện, để làm cho tệp jar của bạn có thể thực thi, hãy đặt dòng chính: dòng trong tệp MANIFEST.MF của bạn.

Dưới đây là một ví dụ từ một jar thực thi tôi xây dựng:

Main-Class: com.example.app.MyAppCLI 
Class-Path: log4j.jar driver.jar libraries.jar 

Và đây là một mục tiêu kiến ​​tương ứng để xây dựng này:

<target name="exejar"> 
    <jar destfile="myapp.jar" 
     basedir="bin" 
     include="**/app/*.class"> 
    <manifest> 
     <attribute name="Main-Class" value="com.example.app.MyAppCLI"/> 
     <attribute name="Class-Path" value="log4j.jar driver.jar libraries.jar"/> 
    </manifest> 
    </jar> 
</target> 

Nếu bạn sẽ sử dụng một công cụ như kiến ​​để xây dựng các lọ thực thi của bạn, nó sẽ làm cho quy trình dễ lặp lại hơn và cũng sẽ xử lý các trường hợp cạnh kỳ lạ cho bạn, giống như những gì xảy ra khi dòng tiêu đề trong MANIFEST.MF quá dài.

0

Nếu bạn sử dụng Maven, bạn có thể đánh giá cao onejar-maven-plugin. Một lợi ích chính là tất cả các lọ phụ thuộc của bạn đều nằm trong các lọ, và mã của bạn nằm trong bình của chính nó. Tất cả các lọ này được đặt trong một cái lọ lớn hơn, được làm cho thực thi, do đó tránh được một số vấn đề về classpath tiềm ẩn. Đọc số usage guide và số này blog post để biết thêm thông tin.

0

có một dự án java bao gồm một số loại tệp khác nhau (hình ảnh, âm thanh, v.v.) và nhiều phụ thuộc jar, cách tốt nhất là gói tất cả vào một cái bình chỉ có thể được nhấp đúp

Cách tốt hơn để triển khai ứng dụng khách phong phú. đang sử dụng Java Web Start. Người dùng cuối sẽ không bao giờ nhìn thấy một Jar, và có thể được cung cấp một máy tính để bàn cắt ngắn hoặc mục trình đơn để khởi động ứng dụng.

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