2015-06-26 2 views
0

Я не уверен, что это проблема с classpath, проблема синтаксиса или проблема с модификатором доступа. Я пытаюсь реализовать пакеты в первый раз в Java и имея с компилятором не поиск классов в родительском пакете.Java не может найти классы в родительском пакете

Я понимаю, что в структурах пакетов нет иерархических отношений, и я явно импортирую родительские классы пакетов в класс дочерних пакетов.

Конструкторы классов родительских пакетов являются общедоступными.

Я под впечатлением, что оба каталога должны быть на пути к классам, но не уверены в этом. В любом случае, у меня есть оба пути на пути к классу, чтобы быть уверенным.

Структура каталогов

home 
| 
|---java 
    | 
    |---src 
     | 
     |---com 
      | 
      |---inv 
       | 
       |---mail 
        | 
        |---SendMail.java 
       | 
       |---TeradataCon.java 
       | 
       |---ExcelWriter.java 

CLASSPATH

([email protected]) /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 
    } 
} 

Выход ошибки

([email protected]) /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 - works
  • Скомпилированная почта/*. Java from/home/java/src/com/inv - doesn ' t work
+2

Хорошо, что вы скомпилировали 'ExcelWriter' заранее? Как правило, вы компилируетесь из каталога 'src', например, с помощью' javac -d ../bin com/inv/mail/*. Java'. –

+3

И самый простой и безопасный способ - всегда скомпилировать все сразу. Изучение работы javac - это хорошо, но как только вы это поняли, реальный инструмент построения, такой как gradle, является обязательным. –

+0

Да - я скомпилировал inv/java. * Заранее. OK - да, я бы определенно хотел бы скомпилировать все классы в com сразу, что было бы предпочтительнее. Попробуй это. К сожалению, Ant/Gradle и т. Д. Не является вариантом в моем случае, по крайней мере, насколько мне известно, но я тоже буду исследовать это. –

ответ

5

Я думаю, вы неправильно поняли путь к классам, для начала. Вы не ставите каталоги пакетов в путь к классам - вы размещаете только root выходных каталогов.

Я предлагаю вам скомпилировать из каталога src, при этом выход будет отправлен в каталог bin или классов. Например, избавиться от переменной 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 и/или сборки.)

+0

Отлично, компиляция прошла отлично! Так что вся эта головная боль по классу пути не нужна. Теперь я пытаюсь запустить SendMail, но Java дает: «Исключение в потоке» main »java.lang.NoClassDefFoundError: SendMail (неправильное имя: com/inv/mail/SendMail)» - означает ли это, что мне нужно переименовать класс public com.inv.mail.SendMail {} теперь, когда он является частью пакета? Edit - no nevermind, он не будет компилироваться таким образом. –

+0

@MattDexter: Нет, это означает, что вам нужно запустить его как 'java -cp ../bin com.inv.mail.SendMail' –

+0

А, а это где путь класса входит в игру, который вы определяете «на лету» как корень (bin) с флагом -cp. Я понял. Очень круто –

Смежные вопросы