Импортировать пользовательский класс Java

Я новичок в Java, и я просмотрел веб-страницы для решений, но ни один из них не работает. Пожалуйста, помогите мне.

У меня есть два файла. Одним из них является файл java, который содержит основную функцию. В нем:

...
VaporVisitor visitor = new VaporVisitor();
...

С помощью этой команды я хочу создать новый объект VaporVisitor, который является классом в отдельном файле с именем VaporVisitor.java. Однако Java не распознает, что такое VaporVisitor, по-видимому, потому что он не знает, что VaporVisitor.java существует (он в том же каталоге). Я попытался сделать их частью одного и того же пакета, в разных пакетах и ​​импортировать... и все они потерпели неудачу. Может ли кто-нибудь дать мне какое-либо руководство?

Спасибо!

EDIT: Вот что я делаю, и сообщение об ошибке, которое я получаю: Итак, у меня есть 3 файла. V2VM (с моей основной функцией), VaporVisitor и предоставленный файл jar, который имеет несколько пользовательских классов. Файл jar не дает мне никаких проблем; он пытается получить Java для распознавания VaporVisitor.

Итак, в V2VM (основная функция) я попытался вставить: import V2VM.java;, который не работал. Я попытался поставить V2VM в подпапку под названием vv, добавил package vv; в VaporVisitor и поместил 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

ХОРОШО. Итак, прежде всего, вы никогда не ссылаетесь на класс в Java, добавляя .java к его имени. Второе: чтобы скомпилировать класс A, который использует другой класс B, класс B должен быть скомпилирован и доступен в пути к классам. Или вы должны скомпилировать и A, и B одновременно.

Итак, вы должны иметь следующую структуру:

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

Оба класса должны начинаться с:

 package vv;

Нет необходимости импортировать V2VM в VaporVisitor или наоборот, поскольку они находятся в одном пакете.

Для компиляции файлов вы должны находиться в каталоге проекта и использовать следующую команду:

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

Это скомпилирует два файла одновременно и поместит их скомпилированные файлы классов в project/classes:

project
   classes
      vv
         V2VM.class
         VaporVisitor.class

Вы помещаете файл jar в путь к классам, потому что скомпилированные классы используют классы из этого файла jar.

Затем, чтобы запустить ваш класс, вам нужно иметь как файл jar, так и каталог классов в пути к классам. И полное имя основного класса - vv.V2VM. Таким образом, команда

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

Если вы работаете в Windows, вы должны использовать \ вместо / и ; вместо :.

Если вы хотите сначала скомпилировать VaporVisiotr, а затем V2VM, вы можете это сделать. Но тогда вам придется сделать следующее:

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

Это компилирует только VaporVisiotr и помещает его файл класса в project/classes. Затем вам нужно скомпилировать V2VM, который зависит от VaporVisitor. Таким образом, скомпилированный класс VaporVisitor должен быть доступен в classpath. Таким образом, команда

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

Если вы решили поместить VaporVisitor в другой пакет (например, vv.foo), вам потребуется следующая структура:

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;

Прочтите учебник о пакетах.