我不确定这是类路径问题、语法问题还是访问修饰符问题。我第一次尝试在 Java 中实现包,但编译器在父包中找不到类。
我知道包结构中没有任何层次关系,并且我在子包类中显式导入父包类。
父包类的构造函数是公共(public)的。
我的印象是这两个目录都需要位于类路径上,但不确定。不管怎样,我可以确定类路径上有两个目录。
目录结构
home
|
|---java
|
|---src
|
|---com
|
|---inv
|
|---mail
|
|---SendMail.java
|
|---TeradataCon.java
|
|---ExcelWriter.java
类路径
(mdexter@server) /home/mdexter/java/src/com/inv/mail # echo $CLASSPATH
.:/storage/mdexter/java/lib/*:/usr/java6_64/jre/lib/*:/usr/java6_64/lib/*:/home/mdexter/java/src/com/inv/*:/home/mdexter/java/src/com/inv/mail/*
SendFile.java(精简)
package com.inv.mail;
import com.inv.TeradataCon;
import com.inv.ExcelWriter;
public class SendMail
{
public static void main(String[] args)
{
TeradataCon teradata = new TeradataCon(some, args, here);
ExcelWriter xls = new ExcelWriter(some, args, here);
}
}
TeradataCon.java(精简)
package com.inv;
public class TeradataCon
{
public TeradataCon()
{
// stuff
}
}
ExcelWriter.java(精简)
package com.inv;
public class ExcelWriter
{
public ExcelWriter()
{
// stuff
}
}
错误输出
(mdexter@server) /home/mdexter/java/src/com/inv/mail # javac *.java
StrategyVolumes.java:3: cannot find symbol
symbol : class TeradataCon
location: package com.inv
import com.inv.TeradataCon;
^
StrategyVolumes.java:4: cannot find symbol
symbol : class ExcelWriter
location: package com.inv
import com.inv.ExcelWriter;
^
StrategyVolumes.java:14: cannot find symbol
symbol : class TeradataCon
location: class com.inv.mail.StrategyVolumes
TeradataCon teradata = new TeradataCon(
^
StrategyVolumes.java:14: cannot find symbol
symbol : class TeradataCon
location: class com.inv.mail.StrategyVolumes
TeradataCon teradata = new TeradataCon(
^
StrategyVolumes.java:32: cannot find symbol
symbol : class ExcelWriter
location: class com.inv.mail.StrategyVolumes
ExcelWriter xls = new ExcelWriter(;
^
StrategyVolumes.java:32: cannot find symbol
symbol : class ExcelWriter
location: class com.inv.mail.StrategyVolumes
ExcelWriter xls = new ExcelWriter(;
^
6 errors
我尝试过的
- 导入 com.inv.*; (应该不重要吧?)
- 从/home/java/src/com/inv 编译父类 - 有效
- 从/home/java/src/com/inv 编译 mail/*.java - 不起作用
最佳答案
首先,我认为您误解了类路径。您不将包目录放在类路径上 - 您只将输出目录的根放在那里。
我建议您从 src
目录进行编译,并将输出保存到 bin
或classes 目录。例如,完全删除您的 CLASSPATH 环境变量(它很少有用,IME - 最好在必要时将其指定为命令行选项),然后使用类似以下内容的内容:
/home/mdexter/java/src # javac -d ../bin com/inv/mail/*.java
或者更好的是,按照 JB Nizet 的建议,将所有内容一起编译:
/home/mdexter/java/src # javac -d ../bin `find . -name '*.java'`
(或者使用 IDE 和/或构建工具。)
关于Java找不到父包中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076820/