Helpex - Trao đổi & giúp đỡ Đăng nhập
1091

Một vấn đề phổ biến mà các nhà phát triển Java mới gặp phải là các chương trình của họ không chạy được với thông báo lỗi: Could not find or load main class ...

Điều này có nghĩa là gì, nguyên nhân gây ra nó và bạn nên khắc phục nó như thế nào?

1091 hữu ích 1 bình luận 2.1m xem chia sẻ
43 trả lời 43
1034

Các java <class-name>cú pháp lệnh

Trước hết, bạn cần hiểu đúng cách để khởi chạy một chương trình bằng lệnh java(hoặc javaw).

Cú pháp bình thường 1 là đây:

    java [ <option> ... ] <class-name> [<argument> ...]

trong đó <option>là một tùy chọn dòng lệnh (bắt đầu bằng ký tự "-"), <class-name>là tên lớp Java đủ điều kiện và <argument>là một đối số dòng lệnh tùy ý được truyền cho ứng dụng của bạn.
1 - Có một cú pháp thứ hai cho các tệp JAR "thực thi" mà tôi sẽ mô tả ở phía dưới.

Tên đủ điều kiện (FQN) cho lớp được viết theo quy ước như bạn làm trong mã nguồn Java; ví dụ

    packagename.packagename2.packagename3.ClassName

Tuy nhiên, một số phiên bản của javalệnh cho phép bạn sử dụng dấu gạch chéo thay vì dấu chấm; ví dụ

    packagename/packagename2/packagename3/ClassName

mà (khó hiểu) trông giống như một tên đường dẫn tệp, nhưng không phải là một tên. Lưu ý rằng thuật ngữ tên đủ điều kiện là thuật ngữ Java tiêu chuẩn ... không phải là thứ tôi vừa tạo ra để làm bạn bối rối :-)

Dưới đây là một ví dụ về giao diện của javalệnh:

    java -Xmx100m com.acme.example.ListUsers fred joe bert

Ở trên sẽ gây ra javalệnh để làm như sau:

  1. Tìm kiếm phiên bản biên dịch của com.acme.example.ListUserslớp.
  2. Tải lớp.
  3. Kiểm tra xem lớp có một mainphương thức với chữ ký , kiểu trả về và các sửa đổi được đưa ra bởi public static void main(String[]). (Lưu ý, tên của đối số phương thức KHÔNG phảimột phần của chữ ký.)
  4. Gọi phương thức đó truyền cho nó các đối số dòng lệnh ("fred", "joe", "bert") là a String[].

Lý do tại sao Java không thể tìm thấy lớp

Khi bạn nhận được thông báo "Không thể tìm hoặc tải lớp chính ...", điều đó có nghĩa là bước đầu tiên đã thất bại. Các javalệnh đã không thể tìm thấy những lớp. Và quả thực, những "..." trong thông điệp sẽ là tên lớp đầy đủjavalà tìm kiếm.

Vậy tại sao nó không thể tìm thấy lớp học?

Lý do số 1 - bạn đã mắc lỗi với đối số tên lớp

Nguyên nhân có thể đầu tiên là bạn có thể đã cung cấp tên lớp sai. (Hoặc ... tên lớp đúng, nhưng ở dạng sai.) Xem xét ví dụ trên, ở đây có nhiều cách sai để chỉ định tên lớp:

  • Ví dụ # 1 - tên lớp đơn giản:

    java ListUser

    Khi lớp được khai báo trong một gói như vậy com.acme.example, thì bạn phải sử dụng tên lớp đầy đủ bao gồm tên gói trong javalệnh; ví dụ

    java com.acme.example.ListUser
  • Ví dụ # 2 - tên tệp hoặc tên đường dẫn thay vì tên lớp:

    java ListUser.class
    java com/acme/example/ListUser.class
  • Ví dụ # 3 - một tên lớp với vỏ không chính xác:

    java com.acme.example.listuser
  • Ví dụ # 4 - một lỗi đánh máy

    java com.acme.example.mistuser
  • Ví dụ # 5 - tên tệp nguồn

    java ListUser.java
  • Ví dụ # 6 - bạn quên hoàn toàn tên lớp

    java lots of arguments

Lý do # 2 - đường dẫn lớp của ứng dụng được chỉ định không chính xác

Nguyên nhân có khả năng thứ hai là tên lớp là chính xác, nhưng javalệnh không thể tìm thấy lớp. Để hiểu điều này, bạn cần hiểu khái niệm "classpath". Điều này được giải thích tốt bởi tài liệu của Oracle:

Vì vậy, nếu bạn đã chỉ định tên lớp một cách chính xác, điều tiếp theo cần kiểm tra là bạn đã chỉ định đường dẫn lớp chính xác chưa:

  1. Đọc ba tài liệu liên kết ở trên. (Có ... ĐỌC chúng. Điều quan trọng là một lập trình viên Java phải hiểu ít nhất những điều cơ bản về cách các cơ chế đường dẫn Java hoạt động.)
  2. Nhìn vào dòng lệnh và / hoặc biến môi trường CLASSPATH có hiệu lực khi bạn chạy javalệnh. Kiểm tra xem tên thư mục và tên tệp JAR có đúng không.
  3. Nếu có tên đường dẫn tương đối trong đường dẫn lớp, hãy kiểm tra xem chúng có giải quyết chính xác không ... từ thư mục hiện tại có hiệu lực khi bạn chạy javalệnh.
  4. Kiểm tra xem lớp (được đề cập trong thông báo lỗi) có thể được định vị trên đường dẫn lớp hiệu quả .
  5. Lưu ý rằng cú pháp classpath khác với Windows so với Linux và Mac OS. (Dấu phân tách classpath nằm ;trên Windows và :trên các bộ phân loại khác. Nếu bạn sử dụng trình phân tách sai cho nền tảng của mình, bạn sẽ không nhận được thông báo lỗi rõ ràng. Thay vào đó, bạn sẽ nhận được một tệp hoặc thư mục không tồn tại trên đường dẫn sẽ bị bỏ qua trong âm thầm .)

Lý do # 2a - thư mục sai nằm trên đường dẫn lớp

Khi bạn đặt một thư mục trên đường dẫn lớp, nó sẽ tương ứng với thư mục gốc của không gian tên đủ điều kiện. Các lớp được đặt trong cấu trúc thư mục bên dưới gốc đó, bằng cách ánh xạ tên đủ điều kiện vào một tên đường dẫn . Vì vậy, ví dụ, nếu "/ usr / local / acme / class" nằm trên đường dẫn lớp, thì khi JVM tìm kiếm một lớp được gọi com.acme.example.Foon, nó sẽ tìm tệp ". Class " với tên đường dẫn này:

  /usr/local/acme/classes/com/acme/example/Foon.class

Nếu bạn đã đặt "/ usr / local / acme / class / com / acme / example" trên đường dẫn lớp, thì JVM sẽ không thể tìm thấy lớp.

Lý do # 2b - đường dẫn thư mục con không khớp với FQN

Nếu các lớp FQN của bạn là com.acme.example.Foon, thì JVM sẽ tìm "Foon. Class" trong thư mục "com / acme / example":

  • Nếu cấu trúc thư mục của bạn không khớp với cách đặt tên gói theo mẫu ở trên, JVM sẽ không tìm thấy lớp của bạn.

  • Nếu bạn cố đổi tên một lớp bằng cách di chuyển nó, điều đó cũng sẽ thất bại ... nhưng stacktrace ngoại lệ sẽ khác.

Để đưa ra một ví dụ cụ thể, giả sử rằng:

  • bạn muốn chạy com.acme.example.Foonlớp
  • đường dẫn tập tin đầy đủ là /usr/local/acme/classes/com/acme/example/Foon.class,
  • thư mục làm việc hiện tại của bạn là /usr/local/acme/classes/com/acme/example/,

sau đó:

# wrong, FQN is needed
java Foon

# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon

# wrong, similar to above
java -classpath . com.acme.example.Foon

# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon

# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon

Ghi chú:

  • Các -classpathtùy chọn có thể được rút ngắn xuống còn -cptrong hầu hết các phát hành Java. Kiểm tra các mục thủ công tương ứng cho java, javacv.v.
  • Hãy suy nghĩ cẩn thận khi lựa chọn giữa tên đường dẫn tuyệt đối và tương đối trong đường dẫn lớp. Hãy nhớ rằng một tên đường dẫn tương đối có thể "phá vỡ" nếu thư mục hiện tại thay đổi.

Lý do # 2c - thiếu phụ thuộc từ đường dẫn lớp

Classpath cần bao gồm tất cả các lớp khác (không phải hệ thống) mà ứng dụng của bạn phụ thuộc vào. (Các lớp hệ thống được đặt tự động và bạn hiếm khi cần quan tâm đến vấn đề này.) Để lớp chính tải chính xác, JVM cần tìm:

(Lưu ý: các đặc tả JLS và JVM cho phép một số phạm vi để JVM tải các lớp "một cách lười biếng" và điều này có thể ảnh hưởng khi ném ngoại lệ trình nạp lớp.)

Lý do # 3 - lớp đã bị khai báo sai gói

Đôi khi xảy ra việc ai đó đặt một tệp mã nguồn vào thư mục sai trong cây mã nguồn của họ hoặc họ bỏ qua phần packagekhai báo. Nếu bạn làm điều này trong một IDE, trình biên dịch của IDE sẽ cho bạn biết về điều này ngay lập tức. Tương tự như vậy nếu bạn sử dụng một công cụ xây dựng Java phong nha, công cụ này sẽ chạy javactheo cách sẽ phát hiện vấn đề. Tuy nhiên, nếu bạn xây dựng mã Java bằng tay, bạn có thể thực hiện theo cách mà trình biên dịch không nhận thấy vấn đề và tệp ". Class" không nằm ở vị trí mà bạn mong đợi.

Vẫn không thể tìm thấy vấn đề?

Có rất nhiều thứ để kiểm tra, và rất dễ bỏ lỡ một cái gì đó. Hãy thử thêm -Xdiagtùy chọn vào javadòng lệnh (như điều đầu tiên sau java). Nó sẽ đưa ra nhiều thứ khác nhau về tải lớp và điều này có thể cung cấp cho bạn manh mối về vấn đề thực sự là gì.

Ngoài ra, hãy xem xét các sự cố có thể xảy ra do sao chép và dán các ký tự vô hình hoặc không phải ASCII từ các trang web, tài liệu, v.v. Và xem xét "homoglyphs", hai chữ cái hoặc ký hiệu trông giống nhau ... nhưng không.


các java -jar <jar file>cú pháp

Cú pháp thay thế được sử dụng cho các tệp JAR "thực thi" như sau:

  java [ <option> ... ] -jar <jar-file-name> [<argument> ...]

ví dụ

  java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

Trong trường hợp này, tên của lớp điểm đầu vào (nghĩa là com.acme.example.ListUser) và đường dẫn lớp được chỉ định trong MANIFEST của tệp JAR.


IDE

Một IDE Java điển hình có hỗ trợ để chạy các ứng dụng Java trong chính JVM IDE hoặc trong một JVM con. Chúng thường miễn dịch với ngoại lệ cụ thể này, vì IDE sử dụng các cơ chế riêng của nó để xây dựng đường dẫn lớp thời gian chạy, xác định lớp chính và tạo javadòng lệnh.

Tuy nhiên, vẫn có thể xảy ra ngoại lệ này, nếu bạn làm những việc phía sau IDE. Ví dụ, nếu trước đây bạn đã thiết lập Trình khởi chạy ứng dụng cho ứng dụng Java của mình trong Eclipse và sau đó bạn đã di chuyển tệp JAR chứa lớp "chính" sang một vị trí khác trong hệ thống tệp mà không thông báo cho Eclipse , Eclipse sẽ vô tình khởi chạy JVM với một classpath không chính xác.

Nói tóm lại, nếu bạn gặp vấn đề này trong IDE, hãy kiểm tra những thứ như trạng thái IDE cũ, tham chiếu dự án bị hỏng hoặc cấu hình trình khởi chạy bị hỏng.

IDE cũng có thể bị nhầm lẫn. IDE là những phần mềm cực kỳ phức tạp bao gồm nhiều phần tương tác. Nhiều trong số các phần này áp dụng các chiến lược bộ nhớ đệm khác nhau để làm cho toàn bộ IDE đáp ứng. Điều này đôi khi có thể đi sai, và một triệu chứng có thể là vấn đề khi khởi chạy ứng dụng. Nếu bạn nghi ngờ điều này có thể xảy ra, thì đáng để khởi động lại IDE của bạn.


Tài liệu tham khảo khác

1034 hữu ích 5 bình luận chia sẻ
203

Nếu tên mã nguồn của bạn là HelloWorld.java, mã được biên dịch của bạn sẽ là HelloWorld.class.

Bạn sẽ gặp lỗi đó nếu bạn gọi nó bằng cách sử dụng:

java HelloWorld.class

Thay vào đó, sử dụng cái này:

java HelloWorld
203 hữu ích 5 bình luận chia sẻ
113

Nếu các lớp của bạn nằm trong các gói thì bạn phải vào cdthư mục chính và chạy bằng tên đầy đủ của lớp (packName.MainClassName).

Thí dụ:

Các lớp học của tôi ở đây:

D:\project\com\cse\

Tên đầy đủ của lớp chính của tôi là:

com.cse.Main

Vì vậy, tôi cdtrở lại thư mục chính:

D:\project

Sau đó ban hành javalệnh:

java com.cse.Main
113 hữu ích 1 bình luận chia sẻ
46

Nếu bạn định nghĩa lớp chính và phương thức chính trong a package, bạn nên chạy nó trên thư mục phân cấp, sử dụng tên đầy đủ của lớp ( packageName.MainClassName).

Giả sử có một tệp mã nguồn (Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

Để chạy mã này, bạn nên đặt Main.Classtrong gói như thư mục ./com/test/Main.Java. Và trong thư mục gốc sử dụng java com.test.Main.

46 hữu ích 5 bình luận chia sẻ
38

Khi cùng một mã hoạt động trên một PC, nhưng nó hiển thị lỗi ở một PC khác, giải pháp tốt nhất tôi từng tìm thấy là biên dịch như sau:

javac HelloWorld.java
java -cp . HelloWorld
38 hữu ích 4 bình luận chia sẻ
30

Điều gì đã giúp tôi là chỉ định classpath trên dòng lệnh, ví dụ:

  1. Tạo một thư mục mới, C:\temp

  2. Tạo tệp Temp.java C:\temp, với lớp sau:

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
  3. Mở một dòng lệnh trong thư mục C:\tempvà viết lệnh sau để biên dịch lớp Temp:

    javac Temp.java
  4. Chạy lớp Java đã biên dịch, thêm -classpathtùy chọn để cho JRE biết nơi tìm lớp:

    java -classpath C:\temp Temp Hello!
30 hữu ích 5 bình luận chia sẻ
24

Theo thông báo lỗi ("Không thể tìm thấy hoặc tải lớp chính"), có hai loại sự cố:

  1. Không thể tìm thấy lớp chính
  2. Không thể tải lớp chính (trường hợp này không được thảo luận đầy đủ trong câu trả lời được chấp nhận)

Không thể tìm thấy lớp chính khi có lỗi chính tả hoặc cú pháp sai trong tên lớp đủ điều kiện hoặc nó không tồn tại trong đường dẫn lớp được cung cấp .

Không thể tải lớp chính khi lớp không thể được khởi tạo , thông thường lớp chính mở rộng một lớp khác và lớp đó không tồn tại trong đường dẫn lớp được cung cấp.

Ví dụ:

public class YourMain extends org.apache.camel.spring.Main

Nếu không bao gồm lò xo lạc đà, lỗi này sẽ được báo cáo.

24 hữu ích 5 bình luận chia sẻ
14

Đôi khi những gì có thể gây ra vấn đề không liên quan gì đến lớp chính, và tôi đã phải tìm ra vấn đề này một cách khó khăn. Đó là một thư viện được tham chiếu mà tôi đã chuyển đi và nó đã cho tôi:

Không thể tìm thấy hoặc tải lớp xxx chính của Linux

Tôi chỉ xóa tham chiếu đó, thêm nó một lần nữa và nó hoạt động tốt trở lại.

14 hữu ích 5 bình luận chia sẻ
13

Tôi đã có một lỗi như vậy trong trường hợp này:

java -cp lib.jar com.mypackage.Main

Nó hoạt động với ;Windows và :cho Unix:

java -cp lib.jar; com.mypackage.Main
13 hữu ích 2 bình luận chia sẻ
12

Sử dụng lệnh này:

java -cp . [PACKAGE.]CLASSNAME

Ví dụ: Nếu tên lớp của bạn là Hello. Class được tạo từ Hello.java thì hãy sử dụng lệnh dưới đây:

java -cp . Hello

Nếu tệp Hello.java của bạn nằm trong gói com.demo thì hãy sử dụng lệnh bên dưới

java -cp . com.demo.Hello

Với JDK 8 nhiều lần xảy ra rằng tệp lớp có trong cùng một thư mục, nhưng javalệnh mong đợi classpath và vì lý do này, chúng tôi thêm -cp .để lấy thư mục hiện tại làm tham chiếu cho đường dẫn lớp.

12 hữu ích 5 bình luận chia sẻ
11

Hãy thử -Xdiag .

Câu trả lời của Steve C bao gồm các trường hợp có thể độc đáo, nhưng đôi khi để xác định xem lớp không thể được tìm thấy hoặc tải có thể không dễ dàng như vậy. Sử dụng java -Xdiag(kể từ JDK 7). Điều này in ra một stacktrace đẹp cung cấp một gợi ý về ý Could not find or load main classnghĩa của thông điệp tin nhắn.

Ví dụ, nó có thể trỏ bạn đến các lớp khác được sử dụng bởi lớp chính không thể tìm thấy và ngăn lớp chính được tải.

11 hữu ích 0 bình luận chia sẻ
9

Trong trường hợp này, bạn có:

Không thể tìm thấy hoặc tải lớp chính ? Classpath

Đó là bởi vì bạn đang sử dụng "-classpath", nhưng dấu gạch ngang không phải là dấu gạch ngang được sử dụng bởi javatrên dấu nhắc lệnh. Tôi đã có vấn đề này sao chép và dán từ Notepad sang cmd.

9 hữu ích 1 bình luận chia sẻ
7

Trong trường hợp của tôi, lỗi xuất hiện do tôi đã cung cấp tên tệp nguồn thay vì tên lớp.

Chúng ta cần cung cấp tên lớp chứa phương thức chính cho trình thông dịch.

7 hữu ích 1 bình luận chia sẻ
6

Tôi đã dành một khoảng thời gian kha khá để cố gắng giải quyết vấn đề này. Tôi nghĩ rằng bằng cách nào đó tôi đã thiết lập đường dẫn lớp của mình không chính xác nhưng vấn đề là tôi đã gõ:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

thay vì:

java -cp C:/java/MyClasses utilities/myapp/Cool   

Tôi nghĩ rằng ý nghĩa của đủ điều kiện có nghĩa là bao gồm tên đường dẫn đầy đủ thay vì tên gói đầy đủ.

6 hữu ích 2 bình luận chia sẻ
5

Đầu tiên thiết lập đường dẫn bằng lệnh này;

set path="paste the set path address"

Sau đó, bạn cần tải chương trình. Nhập "cd (tên thư mục)" vào ổ đĩa được lưu trữ và biên dịch nó. Ví dụ: nếu chương trình của tôi được lưu trên ổ D, hãy gõ "D:" nhấn enter và gõ "cd (tên thư mục)".

5 hữu ích 3 bình luận chia sẻ
5

Điều đã khắc phục vấn đề trong trường hợp của tôi là:

Nhấp chuột phải vào dự án / lớp bạn muốn chạy, sau đó Run As-> Run Configurations. Sau đó, bạn nên sửa cấu hình hiện tại hoặc thêm mới theo cách sau:

mở Classpathtab, nhấp vào Advanced...nút sau đó thêm binthư mục của dự án của bạn.

5 hữu ích 0 bình luận chia sẻ
5

Có vẻ như tất cả các câu trả lời đều hướng tới người dùng Windows. Đối với Mac, phân tách đường dẫn là :, không ;. Vì lỗi thiết lập đường dẫn sử dụng ;không bị ném nên điều này có thể khó khám phá nếu đến từ Windows sang Mac.

Đây là lệnh Mac tương ứng:

java -classpath ".:./lib/*" com.test.MyClass

Trường hợp trong ví dụ này gói com.testvà một libthư mục cũng được đưa vào đường dẫn lớp.

5 hữu ích 2 bình luận chia sẻ
5

Không thể tìm thấy hoặc tải lớp chính có nghĩa là gì?

Vị trí tệp lớp: C: \ test \ com \ company

Tên tệp: Main. Class

Tên lớp đầy đủ: com.company.Main

Lệnh dòng lệnh:

java  -classpath "C:\test" com.company.Main

Lưu ý ở đây rằng đường dẫn lớp KHÔNG bao gồm \ com \ company

5 hữu ích 0 bình luận chia sẻ
5

Nếu bạn sử dụng Maven để xây dựng tệp JAR, vui lòng đảm bảo chỉ định lớp chính trong tệp pom.xml:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>class name us.com.test.abc.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
5 hữu ích 0 bình luận chia sẻ
5

Điều này có thể giúp bạn nếu trường hợp của bạn đặc biệt giống như của tôi: khi mới bắt đầu, tôi cũng gặp phải vấn đề này khi tôi cố chạy một chương trình Java.

Tôi đã biên dịch nó như thế này:

javac HelloWorld.java

Và tôi đã cố chạy cũng với phần mở rộng tương tự:

java Helloworld.java

Khi tôi loại bỏ .javavà viết lại lệnh như thế java HelloWorld, chương trình chạy hoàn hảo. :)

5 hữu ích 3 bình luận chia sẻ
4

Đây là một trường hợp cụ thể, nhưng vì tôi đã đến trang này để tìm giải pháp và không tìm thấy nó, tôi sẽ thêm nó vào đây.

Windows (được thử nghiệm với 7) không chấp nhận các ký tự đặc biệt (như á) trong tên lớp và tên gói. Linux, mặc dù.

Tôi đã tìm thấy điều này khi tôi xây dựng một .jarNetBeans và cố gắng chạy nó trong dòng lệnh. Nó chạy trong NetBeans nhưng không phải trong dòng lệnh.

4 hữu ích 0 bình luận chia sẻ
4

Trên Windows đặt .;ở giá trị CLASSPATH ngay từ đầu.

Các . (dấu chấm) có nghĩa là "tìm trong thư mục hiện tại". Đây là một giải pháp lâu dài.

Ngoài ra, bạn có thể đặt "một lần" với thiết lập CLASSPATH=%CLASSPATH%;.. Điều này sẽ kéo dài chừng nào cửa sổ cmd của bạn đang mở.

4 hữu ích 1 bình luận chia sẻ
3

Bạn thực sự cần phải làm điều này từ srcthư mục. Ở đó bạn gõ dòng lệnh sau:

[name of the package].[Class Name] [arguments]

Giả sử lớp của bạn được gọi CommandLine.classvà mã trông như thế này:

package com.tutorialspoint.java;

    /**
     * Created by mda21185 on 15-6-2016.
     */

    public class CommandLine {
        public static void main(String args[]){
            for(int i=0; i<args.length; i++){
                System.out.println("args[" + i + "]: " + args[i]);
            }
        }
    }

Sau đó, bạn nên cdvào thư mục src và lệnh bạn cần chạy sẽ giống như thế này:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

Và đầu ra trên dòng lệnh sẽ là:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
3 hữu ích 2 bình luận chia sẻ
3

Khi chạy javavới -cptùy chọn như đã quảng cáo trong Windows PowerShell bạn có thể nhận được một lỗi mà trông giống như sau:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

Để PowerShell chấp nhận lệnh, các đối số của -cptùy chọn phải được chứa trong dấu ngoặc kép như trong:

java -cp 'someDependency.jar;.' ClassName

Hình thành lệnh theo cách này sẽ cho phép Java xử lý các đối số đường dẫn chính xác.

3 hữu ích 0 bình luận chia sẻ
3

Đôi khi, trong một số trình biên dịch trực tuyến mà bạn có thể đã thử, bạn sẽ gặp lỗi này nếu bạn không viết public class [Classname]nhưng chỉ class [Classname].

3 hữu ích 1 bình luận chia sẻ
3

Được rồi, nhiều câu trả lời đã có, nhưng không ai đề cập đến trường hợp cho phép tập tin có thể là thủ phạm. Khi chạy người dùng không có quyền truy cập vào tệp jar hoặc một trong các thư mục của đường dẫn. Ví dụ: xem xét:

Tập tin Jar trong /dir1/dir2/dir3/myjar.jar

User1 whow sở hữu bình có thể làm:

# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar

Nhưng nó vẫn không hoạt động:

# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram

Điều này là do người dùng đang chạy (User2) không có quyền truy cập vào dir1, dir2 hoặc javalibs hoặc dir3. Nó có thể khiến ai đó phát điên khi User1 có thể xem các tệp và có thể truy cập vào chúng, nhưng lỗi vẫn xảy ra với User2

3 hữu ích 0 bình luận chia sẻ
2

Trong Java, khi bạn đôi khi chạy JVM từ dòng lệnh bằng cách sử dụng java thực thi và đang cố khởi động một chương trình từ một tệp lớp với static static void main (PSVM), bạn có thể gặp phải lỗi bên dưới mặc dù tham số classpath là JVM là chính xác và tệp lớp có mặt trên đường dẫn lớp:

Error: main class not found or loaded

Điều này xảy ra nếu không thể tải tệp lớp với PSVM. Một lý do có thể cho điều đó là lớp có thể đang thực hiện một giao diện hoặc mở rộng một lớp khác không có trên đường dẫn lớp. Thông thường nếu một lớp không nằm trên đường dẫn lớp, lỗi được ném biểu thị như vậy. Nhưng, nếu lớp đang sử dụng được mở rộng hoặc triển khai, java không thể tự tải lớp đó.

Tham khảo: https://www.computingnotes.net/java/error-main- class-not-find-or-load /

2 hữu ích 2 bình luận chia sẻ
2

Tôi đã gặp lỗi này sau khi thực hiện mvn eclipse:eclipse Điều này làm hỏng .classpathtập tin của tôi một chút.

Phải thay đổi dòng .classpathtừ

<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

đến

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />
2 hữu ích 0 bình luận chia sẻ
2

Tôi đã không thể giải quyết vấn đề này bằng các giải pháp được nêu ở đây (mặc dù câu trả lời đã nêu, không còn nghi ngờ gì nữa, đã xóa các khái niệm của tôi). Tôi đã đối mặt với vấn đề này hai lần và mỗi lần tôi đã thử các giải pháp khác nhau (trong IDE Eclipse).

  • Đầu tiên, tôi đã bắt gặp nhiều mainphương thức trong các lớp khác nhau trong dự án của tôi. Vì vậy, tôi đã xóa mainphương thức từ các lớp tiếp theo.
  • Thứ hai, tôi đã thử giải pháp sau:
    1. Nhấp chuột phải vào thư mục dự án chính của tôi.
    2. Đi đến nguồn sau đó dọn dẹp và gắn bó với các cài đặt mặc định và trên Kết thúc. Sau một số nhiệm vụ nền, bạn sẽ được chuyển đến thư mục dự án chính của bạn.
    3. Sau đó, tôi đóng dự án của mình, mở lại và bùng nổ, cuối cùng tôi cũng giải quyết được vấn đề của mình.
2 hữu ích 1 bình luận chia sẻ
2

Trong trường hợp của tôi, tôi đã gặp lỗi vì tôi đã trộn lẫn các tên gói chữ hoa và chữ thường trên hệ thống Windows 7. Thay đổi tên gói cho tất cả các trường hợp thấp hơn đã giải quyết vấn đề. Cũng lưu ý rằng trong kịch bản này, tôi không gặp lỗi khi biên dịch tệp .java thành tệp. Class; nó sẽ không chạy từ cùng thư mục (sub-sub- sub-).

2 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java class main() , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading