繁体   English   中英

在同一 package 中编译两个 java 文件时出现编译错误

[英]Compiling error while compiling two java files in the same package that use each other

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

测试.java:

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

主要.java:

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

如果我在命令行中写: javac Main.java
它创建 Main.class 并自动创建 Test.class 和运行这个程序我使用: java Main

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

我的包
├── Main.java
└── 测试.java

如果我写javac Main.java编译器会说:

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

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

问题1)为什么会发生?

问题 2)当我编译这两个文件时,我无法使用java Main 运行程序。

(错误:无法找到或加载主 class 主)。

有什么问题?

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

试试这个编译

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM