2009-12-29 51 views
8

Tôi nhận được lỗiThiết lập classpath java và JAVA_HOME đúng trong Ubuntu

Exception in thread "main" java.lang.NoClassDefFoundError:

Khi tôi cố gắng và chạy một lớp biên soạn trên Ubuntu. Tôi đang sử dụng một ví dụ Helloworld rất đơn giản và hàng triệu câu trả lời đã tồn tại trên internet cho thấy các biến CLASSPATH và JAVA_HOME của tôi đã được đặt không chính xác.

Tuy nhiên, tôi đã chỉnh sửa etc/môi trường để các thư mục chính xác cũng như thư mục hiện hành:

PATH=".:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun/"

CLASSPATH=".:/usr/lib/jvm/java-1.5.0-sun/lib"

và chúng xuất hiện khi tôi gõ lệnh set. Trong mọi trường hợp, ngay cả khi tôi đặt đường dẫn lớp theo cách thủ công bằng cách sử dụng

sudo java -cp . myfirstjavaprog.class

Tôi gặp lỗi tương tự. Tôi nên tìm ở đâu khác? Đây phải là một vấn đề cấu hình.

Rất cám ơn

+0

http://www.cyberciti.biz/faq/set-environment-variable-linux/ –

Trả lời

6

Bạn muốn bỏ lớp .class từ cuối. Chỉ cần nhập ...

java -cp . myfirstjavaprog 
+0

Tôi rất chán nản đến nỗi tôi không phát hiện ra điều này. – Huguenot

+4

Xảy ra với điều tốt nhất của chúng tôi. – Pace

1

Không, tôi nghĩ rằng đó là biến môi trường CLASSPATH được bỏ qua.

Cách đúng để làm điều đó là sử dụng tùy chọn -classpath khi bạn biên dịch và chạy. Đặt nó cho mỗi và mọi dự án. Bằng chứng bạn có trước khi mắt của bạn cho bạn biết nó là như vậy.

Tại sao CLASSPATH bị bỏ qua? Một số lý do:

  1. Đó là một đồ tạo tác Java 1.0 không có lợi.
  2. JVM không đảm bảo rằng bạn đã đặt một biến làm biến môi trường.
  3. IDE có yêu cầu riêng của chúng, vì vậy chúng không dựa vào nó.
  4. Máy chủ ứng dụng Java EE có yêu cầu riêng của chúng, do đó chúng không dựa vào nó.
  5. Bạn phải cung cấp toàn bộ con đường mọi lúc bởi vì mọi dự án có thể khác nhau. Một khi bạn tiến bộ qua "Hello, World", bạn sẽ thấy mình đang viết kịch bản hoặc sử dụng các công cụ như Ant và Maven để giúp bạn thiết lập CLASSPATH cho dự án của bạn.
+0

điều này sẽ là một ý tưởng tồi .. bởi vì mọi lúc anh ta phải đưa ra đường dẫn đầy đủ – Anand

+0

Tại sao các biến môi trường classpath bị bỏ qua? – Huguenot

+0

@lakshamanan - sai. Anh ta sẽ phải học cách thực hiện nó theo cách phù hợp với các dự án trong tương lai, không có khả năng được biên dịch và chạy trên dòng lệnh. – duffymo

5

tôi khuyên loại bỏ các biến môi trường CLASSPATH, hoặc ít nhất là dùng JRE của bạn/JDK ra khỏi nó.

"." hoàn toàn nằm trong đường dẫn lớp trừ khi được chỉ định khác. Và kể từ khoảng Java 1.3, Java đã đủ thông minh để tìm ra thời gian chạy và thư viện của riêng nó dựa trên đường dẫn thực thi của các tệp thực thi javac/java. Kể từ đó, nó được thừa, nếu không hoàn toàn sai, để xác định những người trên classpath. Chắc chắn .../lib là không chính xác, vì chỉ có các lọ ở đó, không có lớp và những lớp không được lấy ra khỏi đường dẫn lớp nếu chúng không được đặt tên riêng và được đặt tên rõ ràng.

Hiện đại dung nham đủ thông minh để bạn có thể chỉ cần nhập java <classname> khi đứng trong thư mục gốc của đường dẫn lớp, và nó sẽ chỉ hoạt động ™.

+0

Bạn hoàn toàn đúng, nó chỉ ra vấn đề là khi tôi thử và biên dịch bất cứ điều gì mà nhập khẩu các thành phần swing nó cung cấp cho chính xác cùng một lỗi. trong khi ví dụ HelloWorld.java là tốt ... Điều này có vẻ kì quái. – Huguenot

+1

Oh ... lưu ý rằng Windows được giao hàng mặc định với một Java bị hỏng nặng, với các tệp thi hành đang ngồi trong đường dẫn lớp hệ thống Windows. Vui lòng thực hiện "java -version" từ dấu nhắc DOS và xem phiên bản Java bạn đang chạy có phải là phiên bản bạn muốn không! –

+1

cùng một điều có thể nói về Ubuntu; vì nó đi kèm với java GNU, (ít nhất là vài hệ thống Ubuntu mà tôi đã thấy), chứ không phải java của Sun. 'k, nó không bị "làm tê liệt nặng nề" - nhưng nó không phải là java của Sun. – NDP

1

Bạn đang trộn táo và cam. Một lời gọi java hoặc javac thô trên dòng lệnh cần một classpath để biết nơi nó có thể truy cập các lớp của nó. Khi bạn chạy

java -cp pathelement1:pathelement2... MyClass 

bạn đang cung cấp cho java danh sách địa điểm để tìm các lớp có thể chạy được. Nó sẽ không tìm bất cứ nơi nào khác, bao gồm cả ".", Trừ khi bạn nói với nó. Vì vậy, "CLASSPATH" không giúp bạn trừ khi bạn chạy

java -cp $CLASSPATH MyClass 

Không hợp lệ, chỉ cần tắt một lối tắt để tiếp tục nhập lại classpath. Một số chương trình được cấu hình để sử dụng JAVA_HOME, nhưng cuối cùng chạy các chương trình java chỉ cần một đường dẫn lớp cấu hình và đường dẫn đến java (chúng tìm thấy nó thông qua biến JAVA_HOME, vì vậy bạn vẫn cần nó cho những thứ như kiến, nhưng nó vẫn còn khái niệm chỉ là một phím tắt là tốt).

PATH của bạn là đường dẫn nơi hệ thống tìm kiếm tệp nhị phân. Nếu java không nằm trên đường dẫn của bạn (gõ "java", nó sẽ cho bạn thấy cái nào, nếu có, java nằm trên đường dẫn của bạn) chạy/full/path/to/java giống hệt với việc chạy "java" và có hệ thống tìm nhị phân trong biến PATH.

0

Ok Tôi đang tìm sự cố ở sai địa điểm. Nó bật ra rằng Java đã được sử dụng tốt và tôi là nạn nhân của cùng một lỗi cho hai vấn đề riêng biệt.

Tôi ban đầu đang cố gắng chạy một ví dụ xoay mà tôi nhận được từ trang web Java, nhưng tôi đã không nhận thấy rằng nó có định nghĩa gói. Tôi đã thiết lập cấu trúc thư mục chính xác và bây giờ nó chạy tốt.

Khi tôi cố gắng chạy một ví dụ HelloWorld, tôi đã vô tình bao gồm phần mở rộng .class.

Cả hai vấn đề này đều cho tôi lỗi ClassNotFound.

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

1

Sử dụng

sudo update-java-alternatives -s java-6-openjdk 

Nó đặt rất nhiều thứ classpath.

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