Java can't find classes in parent package

I'm not sure if this is a classpath problem, a syntax problem, or an access modifier problem. I'm trying to implement packages for the first time in Java and having with the compiler not finding classes in the parent package.

I understand there isn't any hierarchical relationship in package structures and I am explicitly importing parent package classes in the child package class.

The parent package classes' constructors are public.

I am under the impression both directories need to be on the classpath but not sure about it. Either way, I have both dirs on the classpath to be sure.

Directory Structure

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 (stripped down)

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 (stripped down)

package com.inv;

public class TeradataCon
{
    public TeradataCon()
    {
        // stuff
    }
}

ExcelWriter.java (stripped down)

package com.inv;

public class ExcelWriter
{
    public ExcelWriter()
    {
        // stuff
    }
}

Error output

(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

What I have tried

  • import com.inv.*; (Shouldn't matter right?)
  • Compiled parent classes from /home/java/src/com/inv - works
  • Compiled mail/*.java from /home/java/src/com/inv - doesn't work
Jon Skeet
people
quotationmark

I think you've misunderstood the classpath, for starters. You don't put package directories on the classpath - you only put the root of output directories there.

I suggest you compile from the src directory, with the output going to a bin or classes directory. For example, get rid of your CLASSPATH environment variable entirely (it's rarely useful, IME - better to specify it as a command-line option where necessary) and then use something like:

/home/mdexter/java/src # javac -d ../bin com/inv/mail/*.java

Or better, compile everything together, as JB Nizet suggests:

/home/mdexter/java/src # javac -d ../bin `find . -name '*.java'`

(Or use an IDE and/or build tool.)

people

See more on this question at Stackoverflow