วิธีเรียกใช้ java .class จากบรรทัดคำสั่ง


113

ฉันมีคลาส java ที่คอมไพล์แล้ว:

Echo.class

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

            System.out.println(arg);
    }
}

ฉันcdไปที่ไดเร็กทอรีและป้อน:java Echo "hello"

ฉันได้รับข้อผิดพลาดนี้:

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.

อะไรคือวิธีที่ง่ายที่สุดในการรับโค้ด java ของฉันในรูปแบบที่ฉันสามารถเรียกใช้จากบรรทัดคำสั่งตามที่ต้องใช้ Eclipse IDE


14
คำแนะนำ: คำถามเดิมอาจจะดีกว่าที่จะปล่อยไว้โดยไม่มีการแก้ไขเพื่อไม่ให้คำตอบเป็นโมฆะภายใต้การตรวจสอบอย่างรวดเร็ว แปลกจริงๆที่เห็นลายเซ็นวิธีการที่ถูกต้องและคำตอบมากมายที่บอกว่ามันไม่ถูกต้อง รหัสที่ผิดพลาดควรจะถูกทิ้งไว้เพื่อจุดประสงค์ในการเปรียบเทียบกับเวอร์ชันที่ถูกต้องอย่างน้อยที่สุด
JSmyth

คำตอบ:


119

ลอง:

java -cp . Echo "hello"

สมมติว่าคุณรวบรวมด้วย:

javac Echo.java 

จากนั้นมีโอกาสที่ไดเร็กทอรี "current" ไม่อยู่ใน classpath ของคุณ (โดยที่ java ค้นหาคำจำกัดความ. class)

หากเป็นเช่นนั้นและแสดงรายการเนื้อหาของ dir ของคุณ:

Echo.java
Echo.class

จากนั้นสิ่งนี้อาจใช้งานได้:

java -cp . Echo "hello"

หรือ

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

และในภายหลังเมื่อFredrikชี้ให้เห็นว่าคุณจะได้รับข้อความแสดงข้อผิดพลาดเช่น.

ข้อยกเว้นในเธรด "main" java.lang.NoSuchMethodError: main

เมื่อเป็นเช่นนั้นไปอ่านคำตอบของเขากัน :)


2
-cp. เพื่อบอก Java ว่าเขาควรเพิ่ม (ไดเรกทอรีการทำงานปัจจุบัน) ไปยัง classpath หมายถึงสถานที่ที่เขากำลังมองหารหัส
Fredrik

16

คุณต้องระบุ classpath สิ่งนี้ควรทำ:

java -cp . Echo "hello"

สิ่งนี้บอกให้ java ใช้.(ไดเร็กทอรีปัจจุบัน) เป็น classpath นั่นคือตำแหน่งที่ค้นหาคลาส หมายเหตุเมื่อคุณใช้แพ็กเกจ classpath จะต้องมีไดเร็กทอรี root ไม่ใช่ไดเร็กทอรีย่อยของแพ็กเกจ เช่นถ้าระดับของคุณmy.package.Echoและไฟล์ .class เป็นbin/my/package/Echo.classไดเรกทอรี classpath binที่ถูกต้องคือ


15

คุณไม่มีเมธอดหลักที่ถูกต้อง ... ลายเซ็นควรเป็น: public static void main ( String [] args);

ดังนั้นในกรณีของคุณรหัสควรมีลักษณะดังนี้:

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

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

แก้ไข:โปรดทราบว่าออสการ์ก็ถูกต้องเช่นกันที่คุณหายไป ใน classpath ของคุณคุณจะพบกับปัญหาที่ฉันแก้ไขหลังจากที่คุณจัดการกับข้อผิดพลาดนั้นแล้ว


15

ด้วย Java 11 คุณจะไม่ต้องผ่านอุปกรณ์นี้อีกต่อไป!

แต่คุณสามารถทำได้:

> java MyApp.java

คุณไม่จำเป็นต้องคอมไพล์ล่วงหน้าเพราะทุกอย่างเสร็จสิ้นในขั้นตอนเดียว

คุณสามารถรับ Java 11 JDK ได้ที่นี่: JDK 11 GA Release


> คัดลอก C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java ผู้ชายบางคนชอบวิธีแบบเก่า =)
จูเนียร์

3

หากคุณมีในแหล่งจาวาของคุณ

package mypackage;

และชั้นเรียนของคุณคือ hello.java ด้วย

public class hello {

และใน hello.java นั้นคุณมี

 public static void main(String[] args) {

จากนั้น (หลังจากคอมไพล์) changeDir (cd) ไปยังไดเร็กทอรีที่ hello.class ของคุณอยู่ แล้ว

java -cp . mypackage.hello

คำนึงถึงไดเร็กทอรีปัจจุบันและชื่อแพ็กเกจก่อนชื่อคลาส มันใช้ได้กับ linux mint ของฉันและฉันหวังว่าในระบบปฏิบัติการอื่น ๆ ด้วย

ขอบคุณ Stack ล้นสำหรับข้อมูลมากมาย


1
หมายเหตุ: ไฟล์คลาสควรพบได้ผ่านทาง./mypackage/hello.classชื่อ ดูเพิ่มเติม: คำถาม" เรียกใช้ java ในแพ็กเกจจากบรรทัดคำสั่ง "
ruvim

2

สถานการณ์ของฉันซับซ้อนเล็กน้อย ฉันต้องทำสามขั้นตอนตั้งแต่ฉันใช้. dll ในไดเร็กทอรีทรัพยากรสำหรับรหัส JNI ไฟล์ของฉันคือ

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

รหัสของฉันมีบรรทัดต่อไปนี้

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

ก่อนอื่นฉันต้องย้ายไปที่ไดเรกทอรี classpath

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

ต่อไปฉันต้องเปลี่ยน classpath ให้ชี้ไปที่ไดเร็กทอรีปัจจุบันเพื่อที่คลาสของฉันจะถูกโหลดและฉันต้องเปลี่ยน classpath ให้ชี้ไปที่ไดเร็กทอรีทรัพยากรของเขาเพื่อให้ dll ของฉันถูกโหลด

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

จากนั้นฉันต้องเรียกใช้ java โดยใช้ classname

java com.accessibility.HelloWorld 

0

ก่อนอื่นคุณได้รวบรวมคลาสโดยใช้คอมไพเลอร์ javac บรรทัดคำสั่งหรือไม่? ประการที่สองดูเหมือนว่าเมธอดหลักของคุณจะมีลายเซ็นที่ไม่ถูกต้องซึ่งควรจะใช้อาร์เรย์ของอ็อบเจ็กต์ String แทนที่จะใช้เพียงอันเดียว:

public static void main(String[] args){

เมื่อคุณเปลี่ยนรหัสของคุณเพื่อรับอาร์เรย์ของวัตถุสตริงแล้วคุณต้องแน่ใจว่าคุณกำลังพิมพ์องค์ประกอบของอาร์เรย์แทนที่จะเป็นอาร์เรย์เอง:

System.out.println(args[0])

หากคุณต้องการพิมพ์รายการอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดคุณจะต้องใช้การวนซ้ำเช่น

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.