Cách thực thi .class java từ dòng lệnh


113

Tôi có một lớp java đã biên dịch:

Echo.class

public class Echo {
    public static void main (String arg) {

            System.out.println(arg);
    }
}

Tôi cdvào thư mục và nhập:java Echo "hello"

Tôi gặp lỗi này:

C:\Documents and Settings\joe\My Documents\projects\Misc\bin>java Echo "hello"
Exception in thread "main" java.lang.NoClassDefFoundError: Echo
Caused by: java.lang.ClassNotFoundException: Echo
        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)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Echo.  Program will exit.

Cách đơn giản nhất để lấy mã java của tôi ở dạng mà tôi có thể chạy từ dòng lệnh khi phải sử dụng Eclipse IDE là gì?


14
Gợi ý: Câu hỏi ban đầu, có lẽ, tốt hơn nên không được chỉnh sửa để không làm mất hiệu lực của các câu trả lời, trong quá trình xem xét nhanh. Thực sự kỳ lạ khi nhìn thấy chữ ký phương pháp phù hợp và sau đó là một loạt câu trả lời nói rằng nó không chính xác. Mã lỗi phải được để lại, với mục đích so sánh với phiên bản chính xác, ít nhất.
JSmyth

Câu trả lời:


119

Thử:

java -cp . Echo "hello"

Giả sử rằng bạn đã biên dịch với:

javac Echo.java 

Sau đó, có khả năng thư mục "hiện tại" không có trong classpath của bạn (nơi java tìm kiếm các định nghĩa .class)

Nếu đúng như vậy và liệt kê nội dung của dir của bạn sẽ hiển thị:

Echo.java
Echo.class

Sau đó, bất kỳ điều nào trong số này có thể hoạt động:

java -cp . Echo "hello"

hoặc là

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

Và sau đó khi Fredrik chỉ ra, bạn sẽ nhận được một thông báo lỗi khác như.

Ngoại lệ trong luồng "main" java.lang.NoSuchMethodError: main

Khi điều đó xảy ra, hãy đọc câu trả lời của anh ấy :)


2
Các -cp. để nói với Java rằng anh ta nên thêm. (thư mục làm việc hiện tại) tới đường dẫn classpath, nghĩa là nơi anh ta đang tìm kiếm mã.
Fredrik

16

Bạn cần chỉ định classpath. Điều này nên làm điều đó:

java -cp . Echo "hello"

Điều này yêu cầu java sử dụng .(thư mục hiện tại) làm classpath của nó, tức là nơi nó tìm kiếm các lớp. Lưu ý hơn là khi bạn sử dụng các gói, đường dẫn classpath phải chứa thư mục gốc, không phải các thư mục con của gói. ví dụ: nếu lớp của bạn là my.package.Echovà tệp .class bin/my/package/Echo.classthì đúng thư mục classpath bin.


15

Bạn không có phương thức chính hợp lệ ... Chữ ký phải là: public static void main ( String [] args);

Do đó, trong trường hợp của bạn, mã sẽ giống như sau:

public class Echo {
    public static void main (String[] arg) {

            System.out.println(arg[0]);
    }
}

Chỉnh sửa: Xin lưu ý rằng Oscar cũng đúng ở chỗ bạn đang thiếu. trong classpath của bạn, bạn sẽ gặp phải vấn đề tôi giải quyết sau khi bạn xử lý xong lỗi đó.


15

Với Java 11, bạn sẽ không phải trải qua quá trình nghiêm ngặt này nữa!

Thay vào đó, bạn có thể làm điều này:

> java MyApp.java

Bạn không cần phải biên dịch trước vì tất cả được thực hiện trong một bước.

Bạn có thể tải Java 11 JDK tại đây: Bản phát hành GA JDK 11


> sao chép C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Một số anh chàng thích lối cổ điển hơn =)
Jr.

3

Nếu bạn có trong nguồn java của mình

package mypackage;

và lớp học của bạn là hello.java với

public class hello {

và trong hello.java đó bạn có

 public static void main(String[] args) {

Sau đó (sau khi biên dịch) changeDir (cd) vào thư mục nơi hello.class của bạn. Sau đó

java -cp . mypackage.hello

Lưu ý đến thư mục hiện tại và tên gói trước tên lớp. Nó hoạt động cho bạc hà trên linux của tôi và tôi hy vọng trên hệ điều hành khác cũng

Cảm ơn Stack tràn vì nhiều thông tin.


1
NB: tệp lớp có thể được tìm thấy thông qua ./mypackage/hello.classtên. Xem thêm: Câu hỏi " Chạy java trong gói từ dòng lệnh ".
ruvim

2

Tình hình của tôi hơi phức tạp. Tôi phải thực hiện ba bước vì tôi đang sử dụng .dll trong thư mục tài nguyên, cho mã JNI. Tệp của tôi là

S:\Accessibility\tools\src\main\resources\dlls\HelloWorld.dll
S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class

Mã của tôi chứa dòng sau

System.load(HelloWorld.class.getResource("/dlls/HelloWorld.dll").getPath());

Đầu tiên, tôi phải chuyển đến thư mục classpath

cd /D "S:\Accessibility\tools\src\test\java"

Tiếp theo, tôi phải thay đổi classpath để trỏ đến thư mục hiện tại để lớp của tôi sẽ được tải và tôi phải thay đổi classpath để trỏ đến thư mục tài nguyên của anh ấy để dll của tôi được tải.

set classpath=%classpath%;.;..\..\..\src\main\resources; 

Sau đó, tôi phải chạy java bằng tên lớp.

java com.accessibility.HelloWorld 

0

Đầu tiên, bạn đã biên dịch lớp bằng trình biên dịch javac dòng lệnh chưa? Thứ hai, có vẻ như phương thức chính của bạn có chữ ký không chính xác - nó phải được đưa vào một mảng các đối tượng Chuỗi, thay vì chỉ một:

public static void main(String[] args){

Khi bạn đã thay đổi mã của mình để nhận một mảng các đối tượng Chuỗi, thì bạn cần đảm bảo rằng bạn đang in một phần tử của mảng, thay vì chính mảng:

System.out.println(args[0])

Nếu bạn muốn in toàn bộ danh sách các đối số dòng lệnh, bạn cần sử dụng một vòng lặp, ví dụ:

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
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.