कमांड लाइन से एक जावा .class को कैसे निष्पादित करें


113

मेरे पास एक संकलित जावा क्लास है:

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.

मेरे जावा कोड को एक फॉर्म में प्राप्त करने का सबसे सरल तरीका क्या है जिसे मैं कमांड लाइन से चला सकता हूं जैसा कि ग्रहण आईडीई का उपयोग करने के लिए किया गया है?


14
सुझाव: मूल प्रश्न, त्वरित समीक्षा के तहत उत्तर को अमान्य नहीं करने के लिए बेहतर तरीके से छोड़ दिया जाना चाहिए। सही विधि हस्ताक्षर देखने के लिए वास्तव में अजीब है और फिर जवाब का एक गुच्छा है जो कहता है कि यह गलत था। त्रुटिपूर्ण कोड माना जाता है कि सही संस्करण के साथ तुलना के उद्देश्य से, कम से कम।
JSmyth

जवाबों:


119

प्रयत्न:

java -cp . Echo "hello"

मान लें कि आप के साथ संकलित:

javac Echo.java 

फिर एक मौका है कि "वर्तमान" निर्देशिका आपके क्लासपाथ में नहीं है (जहां जावा .class परिभाषाओं की तलाश करता है)

अगर ऐसा है और आपके dir की सामग्री को सूचीबद्ध करता है:

Echo.java
Echo.class

फिर इनमें से कोई भी काम कर सकता है:

java -cp . Echo "hello"

या

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

और बाद में जैसा कि फ्रेड्रिक बताते हैं कि आपको एक और त्रुटि संदेश मिलेगा।

थ्रेड में अपवाद "मुख्य" java.lang.NoSuchMethodError: मुख्य

जब ऐसा होता है, तो जाकर उसका जवाब पढ़ें :)


2
-सीपी। जावा को बताने के लिए कि उसे जोड़ना चाहिए। क्लासपाथ के लिए (वर्तमान कार्यशील निर्देशिका), मतलब वह स्थान जहाँ वह कोड की तलाश में है।
फ्रेड्रिक

16

आपको क्लासपैथ को निर्दिष्ट करने की आवश्यकता है। यह करना चाहिए:

java -cp . Echo "hello"

यह जावा को .अपने वर्गपथ के रूप में (वर्तमान निर्देशिका) का उपयोग करने के लिए कहता है , अर्थात वह स्थान जहाँ वह कक्षाओं के लिए देखता है। जब आप पैकेज का उपयोग करते हैं, तो ध्यान दें कि क्लासपाथ में रूट डायरेक्टरी होनी चाहिए, न कि पैकेज सबडायरेक्टरीज। उदाहरण के लिए यदि आपकी कक्षा है my.package.Echoऔर .class फ़ाइल है bin/my/package/Echo.class, तो सही classpath निर्देशिका है bin


15

आपके पास कोई मान्य मुख्य विधि नहीं है ... हस्ताक्षर होना चाहिए: सार्वजनिक स्थैतिक शून्य मुख्य ( स्ट्रिंग [] आर्ग्स);

इसलिए, आपके मामले में कोड इस तरह दिखना चाहिए:

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

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

संपादित करें: कृपया ध्यान दें कि ऑस्कर भी सही है जिसमें आप गायब हैं। अपनी कक्षा में, आप उस त्रुटि से निपटने के बाद मेरे द्वारा हल की गई समस्या में भाग लेंगे।


15

जावा 11 के साथ आपको इस रिग्मारोल से गुजरना नहीं पड़ेगा!

इसके बजाय, आप यह कर सकते हैं:

> java MyApp.java

आपको पहले से संकलन करने की आवश्यकता नहीं है, क्योंकि यह सब एक चरण में किया जाता है।

आप यहाँ जावा 11 JDK प्राप्त कर सकते हैं: JDK 11 GA रिलीज़


> प्रतिलिपि C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java। / y && javac MyApp.java और& java -cp। MyApp && del MyApp.class && del MyApp.java कुछ लोग पुराने फैशन के तरीके को पसंद करते हैं =)
जूनियर

3

यदि आपके जावा स्रोत में है

package mypackage;

और आपकी कक्षा हेलो.जावा के साथ है

public class hello {

और उस हैलो में। जावा आपके पास है

 public static void main(String[] args) {

फिर (संकलन के बाद) changeDir (cd) को उस डायरेक्टरी में ले जाएँ जहाँ आपका hello.class है। फिर

java -cp . mypackage.hello

वर्ग नाम से पहले वर्तमान निर्देशिका और पैकेज नाम का ध्यान रखें। यह मेरी टकसाल टकसाल पर काम करता है और मुझे दूसरे ओएस पर भी आशा है

धन्यवाद ढेर जानकारी के एक धन के लिए अतिप्रवाह।


1
एनबी: वर्ग फ़ाइल ./mypackage/hello.classनाम के माध्यम से मिलनी चाहिए । यह भी देखें: " रनिंग जावा इन कमांड लाइन से पैकेज " सवाल।
रुविम

2

मेरी स्थिति थोड़ी जटिल थी। जब से मैं JNI कोड के लिए संसाधन निर्देशिका में .dll का उपयोग कर रहा था, मुझे तीन चरण करने थे। मेरी फाइलें थीं

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());

सबसे पहले, मुझे क्लासपाथ डायरेक्टरी में जाना पड़ा

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

अगला, मुझे वर्तमान निर्देशिका को इंगित करने के लिए क्लासपाथ को बदलना पड़ा ताकि मेरी कक्षा लोड हो जाए और मुझे क्लासपाथ को बदलकर उसे संसाधन निर्देशिका में इंगित करना पड़े ताकि मेरा डीएल लोड हो जाए।

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

फिर, मुझे क्लासनाम का उपयोग करके जावा चलाना था।

java com.accessibility.HelloWorld 

0

सबसे पहले, क्या आपने कमांड लाइन javac संकलक का उपयोग करके कक्षा को संकलित किया है? दूसरा, ऐसा लगता है कि आपके मुख्य तरीके में एक गलत हस्ताक्षर है - यह केवल एक के बजाय स्ट्रिंग वस्तुओं की एक सरणी में होना चाहिए:

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.