Как я могу найти посылку? - PullRequest
1 голос
/ 08 марта 2010

В моем коде есть следующее утверждение import com.apple.dnssd.*;, и компилятор (javac) жалуется на эту строку. Пишет что пакета не существует. Но я думаю, что это может быть «javac» поиск пакета в неправильном месте (каталог). В связи с этим у меня есть два вопроса:

  1. Как узнать, где javac ищет пакеты?

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

ДОБАВЛЕНО:

На другом компьютере с Windows я попробовал то же самое, и «javac» не жалуется (как и прежде, я скомпилировал без каких-либо опций, таких как «-cp»). Я проверяю значения переменной окружения "classpath". Он равен "C: \ Program Files \ Java \ jdk1.6.0_18 \ bin;.; ..". Я пошел в первый каталог classpath и не нашел там чего-то, что могло бы быть библиотекой «com.apple.dnssd» (без jar-файлов, без файлов, содержащих «apple»). Поэтому я не понимаю, почему javac НЕ жалуется на второй компьютер с Windows.

ДОБАВЛЕНО 2:

На машине № 2 я установил Bonjour после JDK. На машине № 1 JDK был установлен после Bonjour.

ДОБАВЛЕНО 3:

На машине № 1 (где я не могу импортировать пакет) я нашел файл jar (он находится в «C: \ Program Files \ Bonjour» и его имя «dns_sd.jar»). Я попытался добавить вышеупомянутый каталог в переменную среды PATHCLASS в Windows 7 (и перезапустил систему). Это не помогает. Я все еще не могу импортировать пакет. Я также попытался указать «-classpath» в командной строке. Это тоже не помогает. Теперь я попытаюсь переустановить Bonjour (как было рекомендовано).

ДОБАВЛЕНО 4:

Я удалил Bonjour и Bonjour SDK. У меня перезагрузить окно. Затем я установил Bonjour и Bonjour SDK. Я должен перезагрузить окно. Это не решило проблему. Я все еще не могу импортировать пакет (javac пишет, что пакет не существует). Я также скопировал файл * .jar в тот же каталог, где находится источник. Это не работает. Я использовал "javac -cp." Это не работает. Сейчас у меня нет вариантов. Я не знаю, что еще я могу попробовать. Кто-нибудь может мне помочь?

ДОБАВЛЕНО 5:


Мой путь к классам: C: \ Program Files \ Java \ jdk1.6.0_18 \ bin;.; ..; "C: \ Program Files \ Bonjour"
Я пытаюсь скомпилировать из этого каталога: C: \ Users \ myname \ java \ bonjour \ example
Я компилирую с помощью следующей команды: javac ServiceAnnouncer.java
Я получаю следующее сообщение об ошибке: ServiceAnnouncer.java:1: пакет com.apple.dnssd не существует

ДОБАВЛЕНО 6:

Наконец-то мне удалось импортировать библиотеку. Я сделал это следующим образом:

javac -cp "C:\Program Files\Bonjour\dns_sd.jar" ServiceAnnouncer.java

Важно то, что я указал файл jar после -cp (не каталог, в котором находится файл jar). Это работает также, если я заменю «dns_sd.jar» на «*». Итак, я пришел к выводу, что после «-cp» мне нужно указать файлы jar (не каталоги).

Ответы [ 4 ]

4 голосов
/ 08 марта 2010

Java / javac будет искать классы в classpath .

Класс по умолчанию classpath охватывает папки /path/to/jre/lib и /path/to/jre/lib/ext. Любые найденные там классы и JAR-файлы будут взяты в пути к классам. Вы можете в теории поместить свои классы и файлы JAR туда, чтобы вам не нужно было ничего делать, чтобы получить java / javac для их поиска. Но на самом деле это крайне плохая практика . Это рецепт для проблем с мобильностью, потому что это не одинаково на всех машинах. Оставьте эти папки нетронутыми.

Затем есть переменная окружения %CLASSPATH%, в которой вы можете указать полные пути к корневым папкам, в которых расположены классы, и / или полные пути к файлам JAR (включая само имя файла JAR!). В Windows несколько путей разделяются точкой с запятой ;, а в * Nix - двоеточием :. Пути с пробелами внутри должны быть заключены в кавычки "". Вот пример:

SET CLASSPATH = .;/path/to/File.jar;"/spacy path to some pkg/with/classes"

Обратите внимание на точку . в начале аргумента. Это указывает текущий путь (текущий рабочий каталог, из которого должна выполняться команда java / javac). Таким образом, он найдет только классы в текущем пути, и, следовательно, не JAR-файлы! Вам необходимо указать полный путь к ним. Начиная с Java 1.6, вы также можете использовать подстановочные знаки для указания нескольких файлов JAR по некоторому пути. Э.Г.

SET CLASSPATH = .;/path/to/all/jars/*;"/spacy path to some pkg/with/classes"

Эта переменная среды на самом деле является удобным способом управления путем к классам, так что вам не нужно вводить одно и то же снова и снова в командной консоли каждый раз. Но это полезно только для новичков в java-пользователях и является причиной всей путаницы в будущем, потому что они подумают, что это "*" 1031 * classpath. Это предположение на самом деле неверно и снова является причиной проблем с переносимостью, потому что это не одинаково на всех машинах.

Правильный способ определения пути к классу - использовать аргумент -cp или -classpath, в котором вы фактически указываете ту же информацию, которую вы хотели бы ввести для %CLASSPATH%, то есть (разделенные двоеточием) и пути с - пробелы в кавычках, например:

javac -cp .;/path/to/File.jar;"/spacy path to some pkg/with/classes" Foo.java

Обратите внимание, что если вы используете аргументы -cp или -classpath (или -jar), то java / javac игнорирует переменную окружения %CLASSPATH% (которая на самом деле является хорошей вещью * +1048 * ТМ * * тысяча сорок девять).

Чтобы сэкономить время при повторном вводе одного и того же снова и снова, просто создайте файл bat или cmd (или, если вы используете * Nix, файл sh). По сути, просто вставьте туда те же команды, которые вы вводите в консоли «plain», а затем выполняйте их обычным для платформы способом.

Чтобы сэкономить больше времени, используйте IDE. Путь к классу, который должен использоваться как во время компиляции, так и во время выполнения внутри IDE, называется «путем сборки». Изучите свойства проекта, и вы увидите.

2 голосов
/ 08 марта 2010

http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

Чтобы ответить на ваш первый вопрос (Как узнать, где javac ищет пакеты):

Проверьте, на что установлена ​​переменная $ CLASSPATH.

echo $CLASSPATH

Здесь JRE будет искать файлы классов и ресурсы. Вы можете установить его как переменную окружения,

set CLASSPATH=path1;path2  ... 

или установите его при запуске javac.

C:> javac -classpath C:\java\MyClasses src_dir

(отличные примеры для javac можно найти здесь )

В этом случае ваш jar-файл, содержащий com.apple.dnssd. *, Должен находиться в вашем classpath Просто скачайте эту банку и поместите ее туда, где ищет ваш путь к классам.

1 голос
/ 08 марта 2010

Предполагая, что dns_sd.jar установлен в 'C: \ Program Files \ Bonjour', попробуйте скомпилировать ваш код следующим образом:

cd C:\Users\myname\java\bonjour\example
javac -classpath C:\Program Files\Bonjour ServiceAnnouncer.java
0 голосов
/ 08 марта 2010

Эта ссылка предполагает, что JAR, содержащий этот пакет, является частью Bonjour для Windows . Ищите это там.

javac.exe ищет только там, где вы говорите с CLASSPATH. Если вы не понимаете, как установить CLASSPATH, я бы порекомендовал прочитать что-то вроде this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...