2010-03-08 3 views
1

В моем коде есть следующее заявление: 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, без файлов, содержащих «яблоко»). Итак, я не понимаю, почему javac НЕ жалуется на вторую машину Windows.

ДОБАВЛЕНО 2:

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

ДОБАВЛЕНО 3:

На машине # 1 (где я не могу импортировать пакет) Я нашел файл банку (он находится в «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".
I попробуйте скомпилировать из этого каталога: C: \ Users \ myname \ java \ bonjour \ example
Скомпилировать следующую команду: javac ServiceAnnouncer.java
Появляется следующее сообщение об ошибке: ServiceAnnouncer.java:1: package com. яблоко.dnssd не существует

ДОБАВЛЕНО 6:

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

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

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

+0

вы должны добавить тег «путь к классам» на этот вопрос (я еще не имеют разрешений) – Timothy

+0

Вы прочитали ссылку, отправленную duffymo? возможно, на машине №2 Bonjour для Windows был установлен после JDK. Вы ищете файл: dns_sd.jar – Timothy

+0

@timmyd, Вы правы. На машине №2 Bonjour был установлен после JDK (на машине №1 JDK был установлен после Bonjour). Я прочитал ответ duffymo, но я до сих пор не понимаю, где находится библиотека на машине №2, и как я могу найти и использовать библиотеку на машине №1. – Roman

ответ

4

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"

переменного Эта среда на самом деле является удобство способ управления классами, так что вам не нужно вводить то же самое снова и снова в командной консоли каждый раз. Но это полезно только для пользователей new-to-java и причиной всей будущей путаницы, потому что они будут думать, что это «путь к». Это предположение фактически является неправильным и снова причиной проблем с переносимостью, потому что это не то же самое на всех машинах.

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

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

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

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

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

+0

* «Обратите внимание на период в начале аргумента. Это указывает на текущий путь.» * - Я думаю, вы имеете в виду «текущий ** каталог **». Если вы говорите «текущий путь», который может быть истолкован как означающий «текущий путь к классам». –

+0

Это правда. путь! = classpath. – BalusC

+0

«... * квитанция * для переносимости проблемы» должен быть * рецепт * ... –

2

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 найдены here)

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

0

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

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

1

Предполагая, что dns_sd.jar установлен в «C: \ Program Files \ Bonjour», а затем попытаться скомпилировать код, как это:

cd C:\Users\myname\java\bonjour\example 
javac -classpath C:\Program Files\Bonjour ServiceAnnouncer.java 
+0

Ну, я попробовал, и это не сработало. Он начал работать, когда я поместил имя файла «: javac -cp» C: \ Program Files \ Bonjour \ dns_sd.jar «ServiceAnnouncer.java – Roman

+0

, так что теперь он работает? – Timothy

+0

теперь он работает :) – Roman