2009-12-28 3 views
0

Я пытаюсь скомпилировать java-файл, который импортирует другие созданные мной пакеты; однако, похоже, он их не находит.javac: package not found error

В моем файле compile.bat у меня есть:

set classpath=c:\t\DB;c:\t\Frame 
javac comchange.java 

где сечение начало commChange.java имеет

package commchange; 

import java.sql.*; 
import java.awt.event.*; 
import java.applet.*; 
import DB.*; 
import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import java.awt.Graphics; 
import Frame.*; 

и структура каталогов:

c:\t\commChange.java 
c:\t\DB 
c:\t\Frame 

ошибка, которую я получаю:

commChange.java:12: package DB does not exist 
import DB.*; 

commChange.java:17: package Frame does not exist 
import Frame.*; 

commChange.java:23: cannot find symbol 
symbol: class Frame 
... 

Любые идеи?

ответ

8

classpath - это список корней каталогов, из которых загружаются классы, идентифицированные package.ClassName. Вам необходимо установить следующие classpath:

set classpath=c:\t 
+0

Это для местоположения файла commChange.java? – phill

+0

@phill: Что значит? –

+3

javac соответствует каждому компоненту имени пакета в качестве каталога внутри каждого пути, указанного в 'CLASSPATH'. – Andrew

2

У вас есть по крайней мере три большие проблемы. Во-первых, путь к классам должен указывать на «корневую» папку, как указано в первом ответе. Когда вы импортируете DB, вам нужно начать поиск в папке с именем t. (Это немного беспокоит меня, что сообщение об ошибке, которое вы отправили, содержит список Import DB. *; В сообщении об ошибке с Import выделено как имя класса вместо ключевого слова.)

Во-вторых, нет рамки пакета, поэтому оператор импорта, который пытается импортировать Frame. * не имеет никакого смысла. Если вы хотите импортировать класс Frame, вы можете импортировать java.awt.Frame ;, но у вас уже есть подстановочный импорт для пакета java.awt, поэтому вам это не нужно.

Наконец, файл comChange.java должен находиться в папке C: \ t \ InvoiceChange, а не в папке C: \ t. Это потому, что оно относится к пакету InvoiceChange.

+0

Цель «Import Frame» - импортировать классы из папки \ Frame. Я, вероятно, должен использовать другое имя. Папка invoicechange переименована в commChange. это не позволило бы мне скомпилировать, если совпадают имена пакетов и папок. спасибо за советы – phill

4

У меня есть несколько замечаний (как и многие вещи на самом деле не так):

  • Традиционно пакеты все нижние имена случаев, т.е. db, invoicechange, frame и т.д.
  • Sun coding standards требуют классов, чтобы начать с большой буквы, то есть commChange следует называть CommChange, а единица компиляции должна использовать то же имя CommChange.java.
  • Исходные файлы должны быть расположены в дереве каталогов, который отражает их дерево пакетов, что означает, что invoicechange.CommChange должно быть расположено в C:\t\invoicechange\CommChange.java.

После того, как вы сделаете эти изменения, вы сможете скомпилировать свои классы.Чтобы сделать это, либо определить путь класса пользователь явно в переменной CLASSPATH среды включает корень дерева источников:

C:> set CLASSPATH=C:\t;%CLASSPATH% 

И просто позвонить javac из C:\t каталога:

C:> dir 
invoicechange/ db/ frame/ 
C:> dir invoicechange 
CommChange.java 
C:> javac invoicechange\CommChange.java 
C:> dir invoicechange 
CommChange.class CommChange.java 

Заметим, что если вы не задаете путь к пользовательскому классу (и, таким образом, не переопределяете путь по умолчанию по умолчанию), javac будет использовать текущий каталог по умолчанию. Другими словами, вызов javac из C:\t без указания пути пользовательского класса в переменной среды CLASSPATH будет работать.

Для получения более подробной информации см. Setting the class path. Собственно, вы также должны посмотреть документацию javac. И чтение Sun coding standards, упомянутое ранее, было бы хорошей идеей.

+0

+1 для указания мерзостей стиля Java –