2011-03-25 33 views
26

Đầu tiên: Tôi nhận thấy rằng vấn đề này nên khá đơn giản và rất nhiều người dường như đã trải nghiệm nó. Tuy nhiên, có vẻ như vấn đề của tôi có thể là hơi khác với các bài đăng hiện có."Không thể tìm thấy lớp chính" khi nhấp đúp vào tệp .jar

Tôi đang sử dụng NetBeans để biên dịch một ứng dụng Java. Khi nó được xây dựng xong, đầu ra đi vào thư mục dist \ chính xác. Tệp jar có mặt ở đó. Nếu tôi đi đến dòng lệnh, điều hướng đến thư mục đó, và gọi như sau:

java -jar Prosperity.jar

tất cả mọi thứ hoạt động tốt. Rõ ràng tên của ứng dụng là Thịnh vượng. Lệnh sau cũng hoạt động tốt:

javaw -jar Prosperity.jar

Tuy nhiên, nhấp đúp vào tập tin .jar đưa ra thông điệp: "Không thể tìm thấy những lớp chính:", và sau đó cung cấp cho các đường dẫn đến tệp .jar. Tôi đã kiểm tra một trăm lần rằng thư mục META-INF tồn tại bên trong tệp .jar và bên trong nó tồn tại một MANIFEST.MF với tên lớp chính xác. Tôi cũng đã kiểm tra rằng lớp chính (App.class) .class file tồn tại bên trong file .jar.

Vì vậy, câu hỏi đặt ra là: sự khác nhau giữa nhấp đúp vào tệp và chạy javaw trên đó là gì? Nó thực sự bực bội vì nó sẽ không chạy!

Cảm ơn mọi hướng bạn có thể cho tôi, tôi đang xé tóc ra đây!

+1

Dường như bằng cách nào đó Java nhận được ý tưởng rằng lớp chính của tôi thực sự được đặt tên là PATH vào tệp jar mà tôi đang chạy. Không có ý tưởng làm thế nào nó đến với điều đó. Dường như bỏ qua giá trị bên trong tệp kê khai và tìm kiếm một lớp chính có tên: C: \ Users \ MyUser \ MyApp \ Prosperity.jar. Tôi giả sử nếu tôi có thể tìm ra cách mà nó trở thành tên của lớp chính mà nó đang tìm kiếm, thì tôi có thể giải quyết vấn đề. – aardvarkk

Trả lời

24

Có lẽ các liên kết tệp của bạn đã bị làm hỏng. Tại dấu nhắc lệnh, hãy thử chạy

ftype | find "jarfile" 

Ngày 64-bit Windows 7 máy tính của tôi, cho thấy

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 

Bạn cũng có thể thay đổi nó với ftype:

ftype jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 
+1

Đây là vé. Để thực sự có được những thứ movin ', tôi đã tải xuống một chương trình được gọi là unassoc có mục đích là xóa tất cả các đường dẫn của các liên kết tệp. Cũng lưu ý là một thực tế là cài đặt ứng dụng của tôi đã làm một cài đặt * im lặng * của JRE, mà (âm thầm, tất nhiên!) * Không * liên kết các tệp .jar một cách chính xác. Vì vậy, tôi đã phải thay đổi chương trình cài đặt chính để không còn làm một cài đặt im lặng, và cũng làm sạch các hiệp hội tập tin của tôi. Sau khi cài đặt lại JRE, tôi có thể thực thi tệp .jar bằng cách nhấp đúp vào nó. Mong ước tôi biết hiệp hội tệp trông như thế nào khi nó bị hỏng ... – aardvarkk

+0

Vui mừng khi thấy bạn làm việc đó. Tôi cho rằng liên kết sai bị thiếu tham số '-jar'. Điều đó sẽ gây ra lỗi mà bạn đã đề cập. –

+1

Dựa trên "Có vẻ như bằng cách nào đó Java đang nhận được ý tưởng rằng lớp chính của tôi thực sự được đặt tên là PATH" Tôi nghĩ điều xảy ra là% 1 không có dấu ngoặc kép xung quanh họ và lọ được đặt trong một đường dẫn bao gồm một không gian . – Fredrik

0

Tôi chỉ có chính xác cùng một vấn đề, cố định theo cùng một cách. Tôi đã phải xóa hoàn toàn liên kết, không chỉ tùy chỉnh người dùng và cài đặt lại JRE.

Hiệp hội trước khi sửa chữa vẫn còn:

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 

Và sau (giống nhau):

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 
+3

xin lỗi, đó có thể là một bình luận – James

9

Chỉ cần tìm thấy bài này ...

Nếu bạn chỉ có vấn đề khi nhấp đúp vào tệp jar và không khởi chạy cmd, có thể do phiên bản của JRE sai (6 ở vị trí 7).

Chỉ cần thay đổi giá trị trong regedit tại địa chỉ:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jarfile\shell\open\command] "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %*

tới:

"C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %*

Không nên có vấn đề nếu giá trị này được cập nhật.


Lưu ý: Chuyển đổi giữa 32 và 64 bit phiên bản trên Windows:

->"C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %* sẽ sử dụng phiên bản 64 bit của JRE ->"C:\Program Files (x86)\Java\jre7\bin\javaw.exe" -jar "%1" %* sẽ sử dụng phiên bản 32 bit của JRE

+1

Tương tự. Thay vào đó bạn có thể sử dụng lệnh 'ftype' từ câu trả lời được phê duyệt (với đường dẫn mới). –

+0

Điều này thực sự hữu ích. Cảm ơn. – CodeBlue

0

Nếu các phương pháp trên không thể giải quyết được sự cố, hãy thử xóa loại tệp .jar khỏi máy tính của bạn (bạn có thể google một phần mềm có tên Unassoc.exe và xóa loại tệp), sau đó khắc phục sự cố! (Ít nhất, đây là trường hợp của tôi!)

1

tìm regedit bạn và kiểm tra theo mục

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command] 
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\"" 


[HKEY_CLASSES_ROOT\jarfile\shell\open\command] 
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\"" 


[HKEY_CURRENT_USER\Software\Classes\Applications\javaw.exe\shell\open\command] 
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\"" 
1

Tôi đã xem qua lỗi này là tốt. Tôi đã kiểm tra các tập tin liên kết bằng cách sử dụng dấu nhắc lệnh và tất cả là chính xác. Nó không phải cho đến khi tôi thử chạy .jar từ dòng lệnh bằng cách sử dụng java -jar MyProgram.jar rằng nó thực sự đã cho tôi thấy thư mục gốc của vấn đề.

Nó chỉ ra các .jar đã được biên soạn dưới JDK 7 trong khi đó tôi chỉ chạy JRE 6. Lỗi này đã trao cho tôi trong dấu nhắc mà đưa tôi đến với các giải pháp thực tế:

Exception in thread "main" java.lang.UnsupportedClassVersionError: MyProgram/Program : Unsupported major.minor version 51.0 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(Unknown Source) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at java.security.SecureClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.access$000(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
Could not find the main class: MyProgram.Program. Program will ex 
it. 
Các vấn đề liên quan