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?
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?
Câu trả lời:
java <class-name>
cú pháp lệnhTrướ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 [ <options> ] <class-name> [<arg> ...]
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à <arg>
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 số cú pháp khác được mô tả ở gần cuối câu trả lời này.
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 java
lệ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ề một java
lệnh sẽ trông như thế nào:
java -Xmx100m com.acme.example.ListUsers fred joe bert
Ở trên sẽ gây ra java
lệnh để làm như sau:
com.acme.example.ListUsers
lớp.main
phươ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ải là một phần của chữ ký.)String[]
.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 java
lệ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 đủ mà java
là tìm kiếm.
Vậy tại sao nó không thể tìm thấy lớp học?
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 là một loạt các 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 java
lệ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 (ngoại trừ Java 11 trở lên; xem bên dưới)
java ListUser.java
Ví dụ # 6 - bạn quên hoàn toàn tên lớp
java lots of arguments
Nguyên nhân có khả năng thứ hai là tên lớp là chính xác, nhưng java
lệ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 về "classpath". Điều này được giải thích tốt bởi tài liệu của Oracle:
java
tài liệu lệnhVì 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 chính xác đường dẫn lớp:
java
lệnh. Kiểm tra xem tên thư mục và tên tệp JAR có đúng không.java
lệnh.;
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 .)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.
Nếu các lớp FQN của bạn là com.acme.example.Foon
, thì JVM sẽ tìm kiế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. Có trách nhiệm nói điều gì đó như thế này:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
bởi vì FQN trong tệp lớp không khớp với những gì trình tải lớp dự kiến sẽ tìm thấy.
Để đưa ra một ví dụ cụ thể, giả sử rằng:
com.acme.example.Foon
lớp/usr/local/acme/classes/com/acme/example/Foon.class
,/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ú:
-classpath
tùy chọn có thể được rút ngắn xuống còn -cp
trong hầu hết các phiên bản Java. Kiểm tra các mục thủ công tương ứng cho java
, javac
v.v.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.)
Đôi khi xảy ra việc ai đó đặ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 package
khai 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 javac
theo 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" kết quả không nằm ở vị trí mà bạn mong đợi.
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 -Xdiag
tùy chọn vào java
dò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.
Cuối cùng, rõ ràng bạn có thể gặp phải vấn đề này nếu bạn cố khởi chạy từ tệp JAR có chữ ký không chính xác (META-INF/*.SF)
.
java
Có ba cú pháp thay thế cho các chương trình Java khởi chạy bằng cách sử dụng java command
.
1) Cú pháp được sử dụng để khởi chạy tệp JAR "thực thi" như sau:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
ví dụ
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
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.
2) Cú pháp khởi chạy một ứng dụng từ một mô-đun (Java 9 trở lên) như sau:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
Tên của lớp entrypoint được xác định bởi <module>
chính nó, hoặc được đưa ra bởi tùy chọn <mainclass>
.
3) Từ Java 11 trở đi, bạn có thể biên dịch và chạy một tệp mã nguồn duy nhất và chạy nó với cú pháp sau:
java [ <options> ] <sourcefile> [<arg> ...]
trong đó (thường là) một tệp có hậu tố ".java".
Để biết thêm chi tiết, vui lòng tham khảo tài liệu chính thức cho java
lệnh phát hành Java mà bạn đang sử dụng.
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 java
dò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, đáng để thử những thứ khác như khởi động lại IDE của bạn, xây dựng lại dự án, v.v.
java -cp ../third-party-library.jar com.my.package.MyClass
; điều này không hoạt động, thay vào đó, cũng cần phải thêm thư mục cục bộ vào đường dẫn lớp (được phân tách bằng :
, như thế này : java -cp ../third-party-library.jar:. com.my.package.MyClass
, sau đó nó sẽ hoạt động
java
nó không nói rằng nó không tìm thấy một lớp nhập khẩu, mà thay vào đó là lớp chính bạn đang cố gắng chạy. Điều này là sai lệch, mặc dù tôi chắc chắn có lý do cho điều đó. Tôi đã có trường hợp java
biết chính xác lớp của tôi ở đâu, tuy nhiên nó không thể tìm thấy một trong những lớp được nhập. Thay vì nói điều đó, nó phàn nàn về việc không tìm thấy lớp học chính của tôi. Thực sự, thông báo.
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
javac TestCode.java
tiếp theojava TestCode
java -classpath . HelloWorld
Nếu các lớp của bạn nằm trong các gói thì bạn phải vào cd
thư mục gốc của dự án của bạn và chạy bằng cách sử dụng tên đủ điều kiện 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 cd
trở lại thư mục dự án gốc:
D:\project
Sau đó ban hành java
lệnh:
java com.cse.Main
Câu trả lời này là để giải cứu các lập trình viên java người mới khỏi sự thất vọng do một lỗi phổ biến, tôi khuyên bạn nên đọc câu trả lời được chấp nhận để có thêm kiến thức chuyên sâu về đường dẫn java.
Nếu bạn định nghĩa lớp chính và phương thức chính trong apackage
, 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.Class
trong gói như thư mục ./com/test/Main.Java
. Và trong thư mục gốc sử dụng java com.test.Main
.
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
javac -classpath . HelloWorld.java
sẽ làm việc! Và đó là một giải pháp tốt hơn trong trường hợp của bạn.
Điều gì đã giúp tôi là chỉ định classpath trên dòng lệnh, ví dụ:
Tạo một thư mục mới, C:\temp
Tạo tệp Temp.java trong C:\temp
, với lớp sau trong đó:
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
Mở một dòng lệnh trong thư mục C:\temp
và viết lệnh sau để biên dịch lớp Temp:
javac Temp.java
Chạy lớp Java đã biên dịch, thêm -classpath
tùy chọn để cho JRE biết nơi tìm lớp:
java -classpath C:\temp Temp Hello!
java
không xem xét $ CLASSPATH (vì bạn đã sử dụng-classpath hoặc -jar) hoặc 2) cài đặt đường dẫn lớp không được đặt trong môi trường không có hiệu lực trong bối cảnh đó java
là chạy; ví dụ vì bạn không "nguồn" tệp nơi đã thêm các lệnh setenv trong trình bao bên phải.
Theo thông báo lỗi ("Không thể tìm hoặc tải lớp chính"), có hai loại sự cố:
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.
extends
). Tôi vừa học được một cách khó khăn là khi lớp chính không tải được vì nó mở rộng một lớp khác không thể tìm thấy , java không báo cáo lớp thực tế nào không được tìm thấy (không giống như NoClassDefFoundError
). Vì vậy, có nó xảy ra, và đó là một tình huống nhổ tóc khi bạn không biết điều này.
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
Main
không có trong tệp JAR. -cp lib.jar;
có nghĩa là điều tương tự như -cp lib.jar;.
thư mục hiện tại được bao gồm trên đường dẫn lớp.
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 class
nghĩ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.
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, tệp lớp có mặt trong cùng một thư mục, nhưng java
lệ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.
-cp .
là không cần thiết, bởi vì nếu $CLASSPATH
không được đặt, thì đó .
là đường dẫn mặc định.
echo %CLASSPATH%
Đầu ra là gì?) Và không, tôi không thể kiểm tra vì tôi không có PC Windows.
Đô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.
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 java
trên dấu nhắc lệnh. Tôi đã có vấn đề này sao chép và dán từ Notepad sang cmd.
Tôi đã có cùng một vấn đề và cuối cùng đã tìm thấy lỗi của mình :) Tôi đã sử dụng lệnh này để biên dịch và nó hoạt động chính xác:
javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java
Nhưng lệnh này không hoạt động với tôi (tôi không thể tìm hoặc tải lớp chính, qrcode
):
java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode
Cuối cùng tôi chỉ thêm ký tự ':' vào cuối đường dẫn lớp và vấn đề đã được giải quyết:
java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
Đ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ỏ .java
và viết lại lệnh như thế java HelloWorld
, chương trình chạy hoàn hảo. :)
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, dấu phân cách classpath là :
không ;
. Vì một lỗi thiết lập đường dẫn sử dụng ;
không được đưa ra 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 là gói com.test
và một lib
thư mục cũng được đưa vào đường dẫn lớp.
/*
cần thiết?
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
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 đủ.
utilities.myapp.Cool
hoặc bất kỳ tên gói nào của nó, nếu có.
Đầ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)".
if "cd" helps then it by luck rather than by judgement
. Điều này là sai (tôi tin), vì java sử dụng thư mục hiện tại .
như một phần của đường dẫn lớp theo mặc định.
Đ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ở Classpath
tab, nhấp vào Advanced...
nút sau đó thêm bin
thư mục của dự án của bạn.
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>
Đâ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 (đã 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 .jar
NetBeans 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.
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ở.
Bạn thực sự cần phải làm điều này từ src
thư 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.class
và 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 cd
và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
cd
vào src
và sau đó chạy lệnh java ../bin com.blah.blah.MyClass
làm việc cho tôi. Vì vậy, cảm ơn cho tiền boa!
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ố đường dẫn đến 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 /
Khi chạy java
với -cp
tùy chọn như được 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 -cp
tù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.
Tôi cũng gặp phải các lỗi tương tự trong khi kiểm tra kết nối JDBC Java MongoDB. Tôi nghĩ rằng thật tốt khi tóm tắt giải pháp cuối cùng của tôi trong thời gian ngắn để trong tương lai bất kỳ ai cũng có thể trực tiếp xem xét hai lệnh và rất tốt để tiếp tục.
Giả sử bạn đang ở trong thư mục tồn tại tệp Java và các phụ thuộc bên ngoài (tệp JAR).
Biên dịch:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Chạy:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
không có gói và 2) bạn không thay đổi thư mục. Đó là, để nói rằng ít nhất, mong manh. Và bằng cách không giải thích các vấn đề, nó sẽ dẫn người mới thử phương pháp này trong các tình huống không hiệu quả . Nói tóm lại, nó khuyến khích "các kỹ thuật lập trình voodoo": en.wikipedia.org/wiki/Voodoo_programming
Được rồi, đã có nhiều câu trả lời, nhưng không ai đề cập đến trường hợp quyền truy cập tệp có thể là thủ phạm.
Khi chạy, người dùng có thể 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
Người dùng 1 sở hữu tệp JAR 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 đó thất vọng 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.
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 .classpath
tập tin của tôi một chút.
Phải thay đổi dòng .classpath
từ
<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" />
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).
main
phươ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 main
phương thức từ các lớp tiếp theo.main
các phương pháp sẽ không khắc phục vấn đề. Không có gì sai về mặt kỹ thuật với một ứng dụng có nhiều điểm vào.