Làm cách nào để giải quyết ClassNotFoundException?


106

Tôi đang cố gắng chạy một ứng dụng Java, nhưng gặp lỗi này:

java.lang.ClassNotFoundException:

Sau dấu hai chấm là vị trí của lớp bị thiếu. Tuy nhiên, tôi biết rằng vị trí đó không tồn tại vì lớp học nằm ở nơi khác. Làm cách nào để cập nhật đường dẫn của lớp đó? Nó có liên quan gì đến class path không?


1
Bạn phải thêm jar trong đó có các lớp thiếu đến classptah
Crom

nếu lớp của bạn có một gói thì hãy chuyển đến thư mục chứa lớp. Ví dụ: nếu gói là gói test.abc, hãy chuyển đến thư mục trước khi kiểm tra và sau đó thực hiện java -cp. test.abc.CLASSNAME (không có .class). Nếu không có gói nào, hãy chuyển đến thư mục chứa lớp và nói java -cp. CLASSNAME
Tùy chọn

Hoặc là một lớp không được triển khai để thời gian chạy của bạn (ví dụ thiếu jar), hoặc lớp không hiển thị trong một bộ nạp lớp nhất định, kiểm tra điều này công cụ này mà giúp xử lý sự cố các vấn đề: jhades.org
Đại học kiễu góc

1
Tôi cũng gặp phải điều này đôi khi. Ngoại lệ này rõ ràng vi phạm quy tắc nêu tất cả các ngữ cảnh cần thiết trong một thông báo ngoại lệ. Nó phải đề cập đến nơi nó đã cố gắng tìm kiếm thứ, những gì trên đường dẫn classpath của bạn. Vui lòng tạo các thông báo ngoại lệ tốt hơn. Đừng bắt chúng tôi tìm kiếm thông tin có thể giúp giải quyết vấn đề.
masterxilo

Câu trả lời:


32

Classpath của bạn bị hỏng (đây là một vấn đề rất phổ biến trong thế giới Java).

Tùy thuộc vào cách bạn khởi động ứng dụng của mình, bạn cần phải sửa đổi đối số -cp, mục nhập Class-Path trong MANIFEST.MF hoặc bố cục đĩa của bạn.


33
Bạn có thể vui lòng nói rõ hơn về nhật thực không? Tôi phải làm gì đây?
user2426316

24
Câu hỏi của bạn không chứa đủ thông tin để cung cấp câu trả lời cụ thể hơn. Hãy xem xét thêm điều đó.
Thorbjørn Ravn Andersen

Độ phân giải phụ thuộc / không khớp phiên bản là một vấn đề rất phổ biến trong tất cả các môi trường lập trình về cơ bản. Chúng tôi có thể nói rằng bất kỳ chương trình nào từng làm là giải quyết các định nghĩa như vậy ... câu hỏi luôn là định nghĩa / đâu là định nghĩa và ý bạn là phiên bản nào?
masterxilo

2
Tôi chỉ nhấn mạnh rằng bên cạnh thế giới Java, tất cả phần mềm đều có cuộc chiến với việc đảm bảo rằng các phiên bản phụ thuộc được tìm thấy chính xác. Tôi có thể đề cập đến dll-hell, trình quản lý gói, trình quản lý phiên bản, hóa đơn khởi động mùa xuân của vật liệu và thùng chứa docker làm ví dụ về vấn đề này và các giải pháp khả thi. Phần mã ngoại lai càng lớn thì vấn đề càng lớn.
masterxilo

@masterxilo Có, nhưng đó không hẳn là vấn đề ở đây và bạn có thể trồng nhầm cây. Tất cả những gì có thể nói là classpath đã bị hỏng.
Thorbjørn Ravn Andersen

45

Classpath là danh sách các vị trí để tải các lớp từ đó.

Các 'vị trí' này có thể là thư mục hoặc tệp jar.

Đối với các thư mục, JVM sẽ tuân theo một mẫu dự kiến ​​để tải một lớp. Nếu tôi có thư mục C: / myproject / class trong classpath của mình và tôi cố gắng tải một lớp com.mycompany.Foo , nó sẽ tìm trong thư mục lớp cho một thư mục có tên là com , sau đó trong thư mục đó có tên là mycompany , và cuối cùng nó sẽ tìm kiếm một tệp có tên là Foo.class trong thư mục đó.

Trong trường hợp thứ hai, đối với các tệp jar, nó sẽ tìm kiếm tệp jar cho lớp đó. Trên thực tế, một tệp jar chỉ là một tập hợp các thư mục được nén như trên. Nếu bạn giải nén một tệp jar, bạn sẽ nhận được một loạt các thư mục và tệp lớp theo mẫu ở trên.

Vì vậy, JVM đi qua một classpath từ đầu đến cuối để tìm kiếm định nghĩa của lớp khi nó cố gắng tải định nghĩa lớp. Ví dụ, trong classpath:

C: / myproject / class; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

JVM sẽ cố gắng tìm trong thư mục lớp học đầu tiên, sau đó trong stuff.jar và cuối cùng trong otherstuff.jar .

Khi bạn nhận được ClassNotFoundException, điều đó có nghĩa là JVM đã duyệt qua toàn bộ classpath và không tìm thấy lớp mà bạn đã cố gắng tham chiếu. Giải pháp thường xuyên xảy ra trong thế giới Java là kiểm tra classpath của bạn.

Bạn xác định một classpath trên dòng lệnh bằng cách nói java -cp và sau đó là classpath của bạn. Trong một IDE chẳng hạn như Eclipse, bạn sẽ có một tùy chọn menu để chỉ định classpath của mình.


13

Đây là giải pháp tốt nhất mà tôi tìm thấy cho đến nay.

Giả sử chúng ta có một gói được gọi là org.mypackagechứa các lớp:

  • HelloWorld (lớp chính)
  • SupportClass
  • UtilClass

và các tệp xác định gói này được lưu trữ vật lý trong thư mục D:\myprogram(trên Windows) hoặc /home/user/myprogram(trên Linux).

Cấu trúc tệp sẽ như thế này: nhập mô tả hình ảnh ở đây

Khi chúng tôi gọi Java, chúng tôi ghi rõ tên của ứng dụng để chạy: org.mypackage.HelloWorld. Tuy nhiên, chúng ta cũng phải cho Java biết nơi tìm các tệp và thư mục xác định gói của chúng ta. Vì vậy, để khởi chạy chương trình, chúng ta phải sử dụng lệnh sau: nhập mô tả hình ảnh ở đây

LƯU Ý: Bạn phải thực hiện javalệnh trên cho dù vị trí hiện tại của bạn là gì. Nhưng đây không phải là trường hợp cho javac. Để biên dịch, bạn thậm chí có thể truy cập trực tiếp vào thư mục chứa .javatệp của mình và trực tiếp thực thi javac ClassName.java.


6

Nếu bạn biết đường dẫn của lớp hoặc jar chứa lớp thì hãy thêm nó vào classpath của bạn trong khi chạy nó. Bạn có thể sử dụng classpath như đã đề cập ở đây:

trên Windows

java -classpath .;yourjar.jar YourMainClass

trên UNIX / Linux

java -classpath .:yourjar.jar YourMainClass

4

Hãy thử những điều này nếu bạn sử dụng maven. Tôi sử dụng maven cho dự án của mình và khi tôi làm mvn clean installvà cố gắng chạy một chương trình, nó ném ra ngoại lệ. Vì vậy, tôi dọn dẹp dự án và chạy lại và nó hoạt động với tôi.

Tôi sử dụng IDE nhật thực.

Đối với ngoại lệ không tìm thấy lớp khi chạy thử nghiệm Junit, hãy thử chạy mvn clean testmột lần. Nó sẽ biên dịch tất cả các lớp thử nghiệm.


bạn đã ở thư mục nào khi chạy "mvn clean test"? nó có nằm trong cùng thư mục với POM không?
TacoB0t

1
Đúng. Chạy nó từ thư mục chứa tệp pom.
Arun

3

Để thêm vị trí của một lớp vào classpath của bạn thông qua dòng lệnh, chỉ cần thêm -cphoặc -classpathvà vị trí của lớp trong khi chạy nó. I E

java -cp "c:/location/of/file" YourProgram

Hoặc nếu bạn đang chạy một IDE chẳng hạn như eclipse, bạn có thể nhấp chuột phải vào project -> build path -> configure build path và thêm JAR bên ngoài chứa lớp của bạn vào đường dẫn xây dựng thì nó sẽ hoạt động tốt.


3

Sử dụng ';' làm dấu phân cách. Nếu các biến môi trường của bạn được đặt chính xác, bạn sẽ thấy cài đặt của mình. Nếu PATH và CLASSPATH của bạn đúng, các cửa sổ sẽ nhận ra các lệnh đó. Bạn KHÔNG cần khởi động lại máy tính khi cài đặt Java.


5
Đó là trên cửa sổ (dấu chấm phẩy), trên unix / linux nó là ':' (dấu hai chấm)
Joeblade

3

Thêm đường dẫn đầy đủ của tệp jar vào CLASSPATH. Trong sử dụng Linux: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". Cách khác đã hoạt động (mà không cần chỉnh sửa CLASSPATH) là giải nén jar trong thư mục dự án hiện tại.

Các cách không hiệu quả với tôi:

1) -cpTùy chọn sử dụng với đường dẫn đầy đủ của tệp jar.

2) Chỉ sử dụng -cptên của jar khi nằm trong thư mục hiện tại

3) Sao chép jar vào thư mục dự án hiện tại

4) Sao chép bình sang vị trí chuẩn của bình java (/ usr / share / java)

Giải pháp này được báo cáo cho lớp com.mysql.jdbc.Driver trong mysql-connector-java.5 - *. Jar, hoạt động trên linux với OpenJDK phiên bản 1.7


Chỉ giải nén JAR phù hợp với tôi, không có giải pháp nào khác làm được
OverCoder

2

Đi lên trên cùng và xóa câu lệnh nhập nếu có và nhập lại lớp. Nhưng nếu đó không phải là trường hợp, hãy làm sạch sau đó xây dựng. Bạn đang sử dụng Netbeans hay Eclipse?


2

Tôi cũng gặp phải vấn đề này và đã thử tất cả các giải pháp khác. Tôi không có tệp .class trong thư mục HTML của mình, tôi chỉ có tệp .java. Sau khi tôi thêm tệp .class, chương trình hoạt động tốt.


2
  1. Nó có thể xảy ra nếu classpath của bạn không đúng

  2. Hãy để chúng tôi đặt một lớp có thể tuần tự hóa và lớp có thể giải thích dưới cùng một tên dự án. Bạn chạy lớp có thể tuần tự hóa, tạo một đối tượng có thể tuần tự hóa trong thư mục cụ thể. Bây giờ bạn cần dữ liệu đã được khử vũ khí hóa. Trong thời gian chờ đợi, nếu bạn thay đổi tên của dự án, nó sẽ không hoạt động. Bạn phải chạy lớp có thể tuần tự hóa trước và sau đó giải mã hóa tệp.


2

Nếu bạn đang sử dụng maven, hãy cố gắng cập nhật maven tất cả các dự án và buộc phải có ảnh chụp nhanh. Nó cũng sẽ làm sạch và xây dựng lại tất cả classpath .. Nó đã giải quyết được vấn đề của tôi ..


2

tôi vừa làm

1. xác thực bộ nhớ đệm và khởi động lại

2. Xây dựng lại dự án của tôi để giải quyết vấn đề


1

Tôi đang cố gắng chạy .jar từ mã C # bằng cách sử dụng Processlớp. Mã java đã chạy thành công từ eclipse nhưng không phải từ C # visual studio và ngay cả khi nhấp trực tiếp vào tệp jar, nó luôn dừng lại ClassNotFoundException:ngoại trừ. Giải pháp cho tôi, là xuất chương trình java dưới dạng "tệp JAR có thể chạy được" thay vì "Tệp JAR". Hy vọng nó có thể giúp một ai đó.


1

Điều này có thể xảy ra trên Windows sau khi cập nhật java trong đó phiên bản cũ của SDK java bị thiếu và phiên bản mới có mặt. Tôi sẽ kiểm tra xem IDE của bạn có đang sử dụng phiên bản SDK java đã cài đặt hay không (IntelliJ: CTRL + SHIFT + ALT + S)


1

Nếu bạn đã thêm nhiều thư viện (Bên thứ ba) ** và Phần mở rộng ** Lớp ứng dụng

Sau đó, nó có thể xảy ra.

Đối với điều đó, bạn phải đặt multiDexEnabled truevà thay thế Applicationlớp mở rộng của mình bằng MultiDexApplication.

Nó sẽ được giải quyết.


1

Câu hỏi chung cơ bản - Câu trả lời chung đơn giản nhất;)

Với thông tin, tôi sẽ đưa ra giả định rằng bạn có thể đang thử một cách tiếp cận cơ bản để viết mã, xây dựng / biên dịch và chạy một ứng dụng console đơn giản như "Hello World", sử dụng một số trình soạn thảo văn bản đơn giản và một số Command Shell.

Lỗi này xảy ra trong trường hợp bỏ hóa:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

Nói cách khác, hãy sử dụng:

..\SomePath>java HelloWorld

PS Việc thêm phần mở rộng tệp .class sẽ gây ra lỗi tương tự. Ngoài ra, hãy đảm bảo có thư mục bin của Java (JDK / JRE) trong PATH của Biến Môi trường của hệ điều hành. (Tìm kiếm thêm chi tiết các bài viết khác về điều này) PPS Tôi đã đúng trong / s giả định của mình chưa?


1

Nếu bạn sử dụng maven, hãy kiểm tra xem bạn có plugin này trong pom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

Nó sẽ đưa sự phụ thuộc của bạn (lý do ngoại lệ) vào bình của bạn.

FYI : điều này sẽ bao gồm tất cả các phụ thuộc được thổi phồng trong bình cuối cùng


@Archit đã thêm.
techkuz

0

Trong trường hợp của tôi, lớp được ném dưới dạng lớp không tìm thấy ngoại lệ có các thuộc tính liên quan đến chứng chỉ ssl. Đóng nhật thực và mở bằng "Chạy với tư cách quản trị viên" sau đó vấn đề đã được giải quyết. Khi nhật thực có quyền liên quan đến vấn đề, nó sẽ đưa ra loại ngoại lệ như vậy.


-7

Đặt tất cả mã vào khối thử rồi bắt ngoại lệ trong khối bắt

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
Điều này không giải quyết ngoại lệ. Điều này ẩn ngoại lệ. Hơn nữa, "e1.getmessage ()" là a) viết hoa sai của getMessage () và b) sẽ không hiệu quả lắm vì nó trả về một chuỗi với một thông báo và bạn sẽ không in nó hoặc ghi nhật ký nó hoặc bất cứ thứ gì!
IBBoard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.