Импортировать пользовательский класс 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;
Прочтите учебник о пакетах.