编译同一包中相互使用的两个java文件时发生编译错误



假设我们在同一目录中有两个.java文件。

Test.java:

public class Test {
public void func() {
System.out.println("Hello World");
}
}

Main.java:

public class Main {
public static void main(String args[]) {
Test t = new Test();
t.func();
}
}

如果我在命令行中写:javacMain.java
它会创建Main.class并自动创建Test.class,为了运行这个程序,我使用:javaMain

但是当我在两个文件的第一行添加package myPack语句时,一切都会改变。文件的结构如下:

myPack
├──Main.java
└──Test.java

如果我写javacMain.java,编译器会说:

Main.java:5:错误:找不到符号Test t=new Test((;

和我应该同时编译它们(javac Main.java Test.java(

问题1(为什么会发生这种情况?

问题2(当我编译这两个文件时,我无法用javaMain运行程序

(错误:无法找到或加载主类main(。

出了什么问题?

问题3(我在某个地方读到,你应该从父目录编译并运行它,如下所示:javac myPack/Main.java(它自动创建Test.class文件(然后javamyPack.Main。这样程序就能正常工作。但是为什么我们要用这种语法从父目录编译和运行程序呢?

尝试编译

# compile all files .java in folder ./myPack and outputing in ./folder-compiled
javac -d folder-compiled $(find ./myPack -name '*.java')

所以你可以用这个运行所有编译的类

# run all Main.class already compiled in ./folder-compiled
java -cp folder-compiled Main

上面的这个例子会起作用,因为我认为你的类路径在myPack/*中,而你没有使用模块化类路径jdk9+,在其他方面可能是不同的

另一种简单易行的方法是使用构建工具,如gradle或maven

最新更新