我不确定这是否是类路径问题,语法问题或访问修饰符问题。我正试图在Java中第一次实现包,并且编译器没有在父包中找到类。
我知道包结构中没有任何层次关系,我明确地在子包类中导入父包类。
父包类的构造函数是公共的。
我认为两个目录都需要在类路径上但不确定。无论哪种方式,我都有类似路径上的两个dirs确定。
目录结构
home
|
|---java
|
|---src
|
|---com
|
|---inv
|
|---mail
|
|---SendMail.java
|
|---TeradataCon.java
|
|---ExcelWriter.java
CLASSPATH
(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
我尝试了什么
答案 0 :(得分:5)
对于初学者,我认为你误解了类路径。您没有将包目录放在类路径上 - 您只将输出目录的 root 放在那里。
我建议你从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和/或构建工具。)