我无法理解软件包的工作原理。没有使用任何 IDE。
我有以下文件夹结构: 〜/ dropbox / api / data
在数据文件夹内,有(仅)Producer.java、Consumer.java。
api
├── data
├── Consumer.java
├── Producer.java
└── Producer.class
package data;
public class Producer {
public static void main(String[] args) {
//do some production
}
public static Producer getProducer() {
//call constructor and return instance
}
}
----------------
package data;
public class Consumer {
public static void main(String[] args) {
Producer worker = getProducer();
}
}
我cd
进入数据文件夹并javac Producer.java
在同一文件夹中编译Producer.class。然后当我运行时java Producer
,我收到错误:无法找到或加载主类Producer,原因:java.lang.NoClassDefFoundError:Producer(错误名称:data/Producer)。
当我尝试java Producer
从java data.Producer
父文件夹进入文件夹时api
,出现同样的错误。
java data.Producer
data
- 这里出了什么问题?如果我删除,它会在数据
package data;
文件夹中编译(javac)并运行(java)。
另外,当我尝试时javac Consumer.java
,出现错误:找不到符号Producer。它们位于同一文件夹中并声明为同一包。
- 这里有什么问题?
该
java
命令要求您指定类的完全限定名称。因此,java Producer
永远不会起作用;您必须键入java data.Producer
。但这还不是全部。
包跟随目录。因此,当您
java data.Producer
按要求输入时,java 会尝试data/Producer.class
从类路径上的每个条目加载。默认情况下,当前目录位于类路径上,但如果您一直在弄乱CLASSPATH
环境变量,则可能不在。为了确保这不是问题,java -cp . data.Producer
。不,你弄乱了。api
java data.Producer
文件夹中的内容可以正常工作。为了确保万无一失,请尝试一下java -cp . data.Producer
(如果确实有效,请清除你弄乱的CLASSPATH
变量。或者只是习惯这样做,这不是一个坏主意)。同样的问题,您需要
javac data/Consumer.java
从 api 目录运行。您不
javac
直接使用而是使用构建工具或 IDE 是有原因的。