Java找不到父包中的类

标签 java

我不确定这是类路径问题、语法问题还是访问修饰符问题。我第一次尝试在 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/

相关文章:

java - App Engine 数据存储 - 查询枚举字段

java - Android Mapview 缩放级别 - 自定义平铺服务器

Java 对象.等于

java - 适用于 Android 开发环境的 Windows XP

java - 我可以使用哪些库将 POJO 绑定(bind)到外部文件以实现 TDD,而不需要太多开销?

java.lang.UnsupportedOperationException : no known implementation of interface jenkins. tasks.SimpleBuildStep 被命名为 Publisher

java - 使用数组列表提取数据时尝试在空对象引用上调用虚拟方法 'java.lang.String'

java - 对于参数类型,运算符 <= 未定义

Java Generics - 方法声明的区别

java - 如何实现Oauth 2.0客户端处理在数据库中存储refreshToken?