2012-04-02 2 views
5

Đây là câu hỏi thực sự ngớ ngẩn mà tôi không thể trả lời một câu trả lời khác.cấu trúc nội bộ chính xác của tệp JAR

Bối cảnh.

Tôi đang sử dụng Eclipse (với một trong các plugin ANT, trên thiết bị đầu cuối XP).

Tôi vừa bắt đầu chơi với ANT, trong [jar] chỉ thị tôi đang thiết lập vị trí của tập tin JAR thành của tôi và tôi nhận được sau khi tôi giải nén 'file

META-INF/MANIFEST. MF MyMainFile.class

phù hợp với nội dung được tìm thấy trên trang web oracle cho cấu trúc bên trong. (ở đây http://docs.oracle.com/javase/tutorial/deployment/jar/view.html)

Nhưng khi tôi cố gắng chạy tệp, tôi gặp lỗi 'không tìm thấy lớp chính'?

Tôi đã thấy một số bài viết khác, nơi người ta đã 'giải nén' các tập tin JAR và kết thúc với một cấu trúc trong các cách sau ...

META-INF/MANIFEST.MF dtvcontrol/DTVControlApp.class

(từ đây http://www.coderanch.com/t/528312/java/java/standalone-application)

Vì vậy, tôi sẽ nhận được một cấu trúc nơi các tập tin lớp học của tôi đang ở trong một thư mục phản ánh tên của gói ... ví dụ

META-INF/MANIFEST.MF MyPackage/MyMainFile.class

và nếu vậy, tại sao tôi nhận được cấu trúc không đúng bằng cách sử dụng ANT hoặc tại sao có 2 cấu trúc nội bộ 'chính xác' khác nhau? (cách chỉ định lớp chính và classpath cho mỗi/kiểm soát những gì tôi nhận được)

Cũng trong trường hợp bạn quan tâm, trong trạng thái tệp MANIFEST (xây dựng bằng ANT) [tên thuộc tính = giá trị "Main-Class" = "MyPackage.MyMainFile" /]

Ngoài ra cấu trúc thư mục của gói đang được xây dựng như sau ...

/JavaDev/MyTestPackage/src (chứa các file nguồn) // JavaDev/MyTestPackage/bin (có chứa các tập tin lớp học từ nhật thực, hoặc từ nhiệm vụ ANT JAVAC, tôi đã đặt tên nó sai? Tôi có nên gọi nó là xây dựng không?)

Hơn nữa, khi tạo jar Tôi không đặt tên nó là 'MyTestPackage.jar' nhưng chỉ đơn giản là 'test.jar' có thể gây ra vấn đề không? Tôi cho rằng không phải là tôi hiểu rõ đó là những gì mà những thứ [định nghĩa] chính là tất cả.

Tiếp tục để tất cả điều này ...

'MyTestPackage' là actualy một lỗi nhỏ về hình ảnh thư viện tin nhắn mà tôi sử dụng ở những nơi khác, và tôi có một tập tin thứ hai mà có một lớp chính để sử dụng để thử nghiệm. Như vậy nó trỏ đến các thư viện khác nhau (tôi có cần sao chép tất cả các thư viện SWT vào một thư mục được chỉ định không?

Tôi đã đọc ở đâu đó nếu tôi tải thư viện vào lớp chính của mình (tôi rõ ràng là mở cửa sổ) thì cố gắng chạy chương trình sẽ không thành công trên 'lớp chính không tìm thấy' nếu tôi sử dụng chúng cũng đúng cho việc thêm vào bất kỳ thành viên 'cuối cùng tĩnh' nào (mà tôi sử dụng cho loggin của các lỗi).

'Sự cố tĩnh' ... Tôi đã cố điều chỉnh đường dẫn lớp trong ANT và tôi gặp phải một số lỗi khác cho kết nối với Log4J và 'wrapper' mà tôi sử dụng (để thực hiện nhập sai), nhưng các thư viện tồn tại nơi chúng nên được đặt trong classpath).

tôi cảm thấy như tôi gần như có .... nhưng không hoàn toàn ...

tôi đang làm điều này cho 'dự án thư viện' nhỏ mà tôi đang tạo ra với mục đích của việc sử dụng MAVAN cho chính gói bên ngoài sẽ kết nối tất cả chúng với nhau ... bây giờ tuy nhiên tôi chỉ muốn có được điều này đi để nó hoạt động.

Tôi có thể cung cấp nguồn đầy đủ hoặc bất kỳ thông tin nào khác theo yêu cầu.

Cảm ơn trước ...

David

+0

vikiiii Tôi sẽ đưa vào một nhận xét ranh mãnh hỏi có bao nhiêu 'mắt' bạn có ... nhưng quyết định không (chú ý 3 "." Không phải một, không phải hai). ;) – DaveM

Trả lời

8

Rất đơn giản khi bạn biết nơi để tìm. Giả sử bạn META-INF/MANIFEST.MF chứa dòng:

Main-Class: mypackage.MyMainFile 

sau đó cấu trúc của bình cần phải được

META-INF/MANIFEST.MF 
mypackage/MyMainFile.class 

nơi MyMainFile có được trong gói thích hợp:

package mypackage; 
public class MyMainFile { 
    public static void main(String[] args) { 
... 

Thông báo lỗi của bạn là do MyMainFile ở sai vị trí.

Edit: nó được một lúc kể từ lần cuối tôi đã làm điều đó với con kiến, nhưng tôi nghĩ rằng bạn cần một cái gì đó như thế này: một cấu trúc tập tin nguồn mà phản ánh Cơ cấu gói, nói

src/main/java/mypackage/MyMainFile.java 

và một thư mục để đặt các tập tin lớp được biên dịch vào, nói

target 

(tôi đang sử dụng công ước maven đây, kiến ​​không quan tâm và bạn có thể sử dụng (rightclick) -> Properties-> Java Build path-> Tab nguồn trong nhật thực để thiết lập nguồn di r đến src/main/java và target để target/classes). Sau đó, trong kiến, có một mục tiêu biên dịch để biên dịch từ nguồn để nhắm mục tiêu:

<target name="compile"> 
    <mkdir dir="target/classes"/> 
    <javac srcdir="src/main/java" destdir="target/classes"/> 
</target> 

để sau khi ant compile bạn sẽ thấy các file class trong mục tiêu

target/classes/mypackage/MyMainFile.class 

Sau đó có một nhiệm vụ jar kiến ​​rằng gói này:

<target name="jar" depends="compile"> 
    <jar destfile="target/MyJarFile.jar" basedir="target/classes"> 
     <manifest> 
      <attribute name="Main-Class" value="mypackage.MyMainFile"/> 
     </manifest> 
    </jar> 
</target> 

Sau khi nói ant compile jar bạn nên có tệp MyJarFile.jar bên trong mục tiêu và

java -jar MyJarFile.jar 

nên chạy phương pháp chính.

+0

OK vì vậy làm cách nào để nhận được ANT cung cấp loại cấu trúc đó trong tệp JAR? Hoặc tôi đang chạy ANt từ vị trí sai? (lưu ý rằng tôi đang chạy tác vụ ANT từ bên trong nhật thực, không phải là CLI). Và tại sao ANT tạo ra một loại cấu trúc thư mục khác (đó là chính xác và cách xác định một hoặc một cấu trúc khác, mà tôi chưa tìm thấy trong tài liệu ANT ... chưa! – DaveM

+0

wallenborn hiện tại trong "biên dịch" của tôi aa destfile = "$ {class}" và class = "build", đây là nơi mà vấn đề của tôi là ?? Tôi sẽ thay đổi nó và xem điều gì sẽ xảy ra ... – DaveM

+0

Trong nhiệm vụ biên dịch, destfile có lẽ là quá Về cơ bản bạn chỉ muốn nói với nhiệm vụ biên dịch: lấy mọi thứ trong thư mục src này, đệ quy, biên dịch nó, và viết các lớp kết quả vào thư mục đích đó, giữ lại các thư mục con – wallenborn