2012-12-01 23 views
5

मैं जावा में नया हूं और मैंने समाधान के लिए वेब के चारों ओर देखा है लेकिन कोई भी काम नहीं कर रहा है। क्रिप्या मेरि सहायता करे।आयात कस्टम जावा क्लास

मेरे पास दो फाइलें हैं। उनमें से एक जावा फ़ाइल है जिसमें मुख्य कार्य होता है। इस रिपोर्ट में:

... 
VaporVisitor visitor = new VaporVisitor(); 
... 
कि आदेश के साथ

, मैं एक नया वस्तु VaporVisitor, जो VaporVisitor.java नामक एक अलग फाइल में एक वर्ग है बनाना चाहते हैं। हालांकि जावा पहचान नहीं करता है कि वाष्पविजिटर क्या है, संभवतः क्योंकि यह नहीं जानता कि VaporVisitor.java मौजूद है (यह एक ही निर्देशिका में है)। मैंने उन्हें एक ही पैकेज का हिस्सा बनाने, विभिन्न पैकेजों में आयात करने और आयात करने की कोशिश की ... और वे सभी विफल हो गए। क्या कोई मुझे कोई मार्गदर्शन दे सकता है?

धन्यवाद!

संपादित करें: मैं वही कर रहा हूं जो मैं कर रहा हूं, और त्रुटि संदेश मुझे मिलता है: तो मेरे पास 3 फाइलें हैं। वी 2VM (मेरे मुख्य समारोह के साथ), वाष्पविजिटर, और एक प्रदान की गई जार फ़ाइल जिसमें कई कस्टम वर्ग हैं। जार फ़ाइल मुझे कोई समस्या नहीं दे रही है; यह वापर विजिटर को पहचानने के लिए जावा प्राप्त करने की कोशिश कर रहा है।

तो वी 2VM (मुख्य समारोह) में, मैंने डालने की कोशिश की है: import V2VM.java; जो काम नहीं करता है। मैंने vvVM को वीवी नामक उपफोल्डर में डालने का प्रयास किया है, package vv; को वाष्पविजिटर में जोड़ा और V2VM.java import vv.* में रखा लेकिन यह भी काम नहीं करता था।

संकलन के लिए, मैं करने की कोशिश की javac -classpath [the jar file].jar V2VM.java

त्रुटियों यह मुझे देता है:

V2VM.java:15: cannot find symbol 
symbol : class VaporVisitor 
location: class V2VM 
VaporVisitor visitor = new VaporVisitor(); 
^ 
V2VM.java:15: cannot find symbol 
symbol : class VaporVisitor 
location: class V2VM 
VaporVisitor visitor = new VaporVisitor(); 
         ^

जब मैं javacc चलाने मैं V2VM है, जो भी है, जहां अन्य दो फ़ाइलें स्थित हैं उसी निर्देशिका में हूँ । मैंने उसी पैकेज में V2VM और VaporVisitor डालने का प्रयास किया है, लेकिन यह भी काम नहीं करता है। तो वे अब किसी भी पैकेज का हिस्सा नहीं हैं ...

संपादित करें 2: VaporVisitor और V2VM

V2VM.java के स्रोत कोड:

package vv; //whether I put this or not, it doesn't work 

//this stuff was provided, and is related to importing contents of the jar file; don't think this is the problem 
import cs132.util.ProblemException; 
import cs132.vapor.parser.VaporParser; 
import cs132.vapor.ast.VaporProgram; 
import cs132.vapor.ast.VBuiltIn.Op; 

import java.io.InputStreamReader; 
import java.io.IOException; 
import java.io.PrintStream; 

import vv.VaporVisitor; //whether I put this or not, it doesn't work 

public class V2VM{ 

public static void main(String [] args){ 

VaporProgram vp = parseVapor(System.in, System.err); 
VaporVisitor visitor = new VaporVisitor(); 

for(int i=0; i<vp.functions.length; i++){ 
for(int j=0; j<vp.functions[i].body.length; j++){ 
    vp.functions[i].body[j].accept(parameter, visitor); 
    } 
} 
} 

public static VaporProgram parseVapor(InputStream in, PrintStream err){ 
    ... 
} 

VaporVisitor.java के लिए:

package vv; 

public class VaporVisitor extends VInstr.VisitorPR<Parameter_Type, Return_Type, RuntimeException>{ 
    .... 
} 

सभी 3 फाइलें एक ही निर्देशिका में हैं vv

+1

आप कैसे संकलित कर रहे हैं? (उदाहरण के लिए, एक आईडीई सामान्य रूप से आपके लिए यह सब कुछ सॉर्ट करेगा।) –

+2

आप उन वर्गों को कैसे संकलित करते हैं। हमें उन निर्देशिकाओं को दिखाएं जहां फाइलें रखी गई हैं, निर्देशिका जहां आप हैं, और कमांड फ़ाइलों को संकलित करने के लिए उपयोग की जाती है। आपके पास सटीक त्रुटि संदेश पेस्ट करें। हमें बताएं कि कक्षाएं किस पैकेज में हैं। –

+0

मैं वास्तव में टर्मिनल का उपयोग कर रहा हूं और बस 'जावैक' चला रहा हूं। यह अच्छा होगा अगर मैं समझ सकूं कि यदि संभव हो तो आईडीई पर भरोसा करने के बजाय मुझे क्या करना चाहिए – pauliwago

उत्तर

9

ठीक है। तो सबसे पहले, आप अपने नाम पर .java जोड़कर जावा में किसी कक्षा को कभी भी संदर्भित नहीं करते हैं। दूसरा: कक्षा ए को संकलित करने के लिए जो किसी अन्य कक्षा बी का उपयोग करता है, कक्षा बी संकलित किया जाना चाहिए, और कक्षापथ में उपलब्ध होना चाहिए। या आपको एक ही समय में ए और बी दोनों संकलित करना होगा।

project 
    lib 
     someFile.jar 
    src 
     vv 
     V2VM.java 
     VaporVisitor.java 
    classes 

दोनों वर्गों के साथ शुरू कर देना चाहिए:

तो, आप निम्नलिखित संरचना होनी चाहिए

package vv; 

VaporVisitor या ठीक इसके विपरीत में V2VM आयात करने के लिए कोई ज़रूरत नहीं है, क्योंकि वे कर रहे हैं एक ही पैकेज

फ़ाइलों को संकलित करने के लिए, आप परियोजना निर्देशिका में होना चाहिए, और निम्न आदेश का उपयोग:

javac -cp lib/someFile.jar -d classes src/vv/V2VM.java src/vv/VaporVisiotr.java 

यह एक बार में दो फ़ाइलें संकलन होगा, और परियोजना/कक्षाओं में उनके संकलित वर्ग फ़ाइलों डाल:

project 
    classes 
     vv 
     V2VM.class 
     VaporVisitor.class 

आप classpath क्योंकि कक्षाएं आप इस जार फ़ाइल से उपयोग वर्गों संकलन में जार फ़ाइल डाल दिया।

फिर, अपनी कक्षा को चलाने के लिए, आपको कक्षा फ़ाइल और क्लासपाथ में कक्षा निर्देशिका दोनों की आवश्यकता है। और मुख्य वर्ग का पूरी तरह से उद्धृत नाम vv.V2VM है। तो आदेश

java -cp lib/someFile.jar:classes vv.V2VM 

है आप विंडोज पर हैं, तो आप \ बजाय /, और ; बजाय : उपयोग करना चाहिए।

यदि आप पहले वापरविसीओटर को संकलित करना चाहते थे, और फिर V2VM, तो आप कर सकते थे। लेकिन तब आप निम्न कार्य करना होगा:

javac -cp lib/someFile.jar -d classes src/vv/VaporVisitor.java 

यह VaporVisiotr केवल संकलित, और project/classes में अपने वर्ग फ़ाइल डाल दिया। फिर आपको V2VM संकलित करने की आवश्यकता है, जो वाष्पविजिटर पर निर्भर करता है। तो संकलित वाष्पविजिटर वर्ग कक्षापथ में उपलब्ध होना चाहिए। तो आदेश

javac -cp lib/someFile.jar:classes -d classes src/vv/V2VM.java 

है यदि आप किसी अन्य पैकेज (उदाहरण के लिए vv.foo), तो आप निम्नलिखित संरचना की आवश्यकता होगी में VaporVisitor लगाने का फैसला किया है:

project 
    lib 
     someFile.jar 
    src 
     vv 
     V2VM.java 
     foo 
      VaporVisitor.java 
    classes 

VaporVisitor.java के साथ शुरू करने की आवश्यकता होगी

package vv.foo; 

और V2VM.java फ़ाइल है की आवश्यकता होगी

package vv; 
import vv.foo.VaporVisitor; 

tutorial about packages पढ़ें।

+0

भयानक स्पष्टीकरण दिया है! –

संबंधित मुद्दे