Помощь с пакетами в java - импорт не работает
Я разработчик С++, а не разработчик Java, но мне нужно заставить этот код работать...
У меня есть 2 общедоступных класса, которые будут использоваться другим продуктом. Я использовал директиву пакета в каждом из java файлов.
package com.company.thing;
class MyClass ...
Когда я пытаюсь скомпилировать тестовое приложение, которое использует это, я добавляю
import com.company.thing.*;
Компилятор javac не работает с ошибками о com.company не существует. (даже если я скомпилирую его в том же каталоге, что и файлы классов, которые я только что сделал из пакета)
Я уверен, что делаю что-то костяное и глупое.
Я прочитал страницы http://java.sun.com/docs/books/tutorial/java/package/usepkgs.html и попытался настроить структуру каталогов, такую как/com/company/thing и т.д., но либо Я полностью ввернул все это или пропустил что-то еще.
ИЗМЕНИТЬ
спасибо за предложения - я уже пробовал путь к классам. Это не помогает.
Я пробовал компилировать
javac -classpath <parent> client.java
и результат:
package com.company does not exist
У меня есть код, который я хочу импортировать (два java файла) в \com\company\product. Я скомпрометирую их. (они содержат MyClass), я даже сделал для них файл jar. Я скопировал файл jar в родительский каталог.
Затем я сделал (в родительском каталоге с клиентским java файлом)
javac -cp <jarfile> *.java
результат:
cannot access MyClass
bad class file: MyClass.class(:MyClass.class)
class file contains wrong class: com.company.product.MyClass
Please remove or make sure it appears in the correct subdirectory of the classpath.
ИЗМЕНИТЬ
Я получил код клиента для компиляции и запуска, если я использовал полное имя для MyClass и скомпилировал его в родительском каталоге. Теперь я совершенно смущен.
скомпилирован без комплекта pathpath - просто
javac *.java
в родительском каталоге - и он работал нормально.
Я могу получить тестовое приложение для компиляции, но это не собирается сокращать его, когда мне нужно интегрировать его в производственный код. Все еще ищут помощь.
EDIT:
Наконец - не уверен, почему он не работал раньше, но я очистил все файлы по всей структуре каталогов, и теперь он работает.
Спасибо
Ответы
Ответ 1
Хорошо, просто чтобы прояснить те вещи, которые уже были опубликованы.
У вас должен быть каталог com
, содержащий каталог company
, содержащий каталог example
, содержащий файл MyClass.java
.
В папке, содержащей com
, выполните:
$ javac com\company\example\MyClass.java
Тогда:
$ java com.company.example.MyClass
Hello from MyClass!
Они должны выполняться из корня исходного дерева. В противном случае javac
и java
не смогут найти какие-либо другие пакеты (фактически, java
даже не сможет запускать MyClass
).
Краткий пример
Я создал папки "testpackage" и "testpackage2". Внутри testpackage я создал TestPackageClass.java, содержащий следующий код:
package testpackage;
import testpackage2.MyClass;
public class TestPackageClass {
public static void main(String[] args) {
System.out.println("Hello from testpackage.TestPackageClass!");
System.out.println("Now accessing " + MyClass.NAME);
}
}
Внутри testpackage2 я создал MyClass.java, содержащий следующий код:
package testpackage2;
public class MyClass {
public static String NAME = "testpackage2.MyClass";
}
Из каталога, содержащего две новые папки, я запустил:
C:\examples>javac testpackage\*.java
C:\examples>javac testpackage2\*.java
Тогда:
C:\examples>java testpackage.TestPackageClass
Hello from testpackage.TestPackageClass!
Now accessing testpackage2.MyClass
Это делает вещи более ясными?
Ответ 2
Да, это проблема класса. Вы должны сообщить компилятору и времени выполнения, что каталог, в котором находятся ваши .class файлы, является частью CLASSPATH. Каталог, который вам нужно добавить, является родительским каталогом "com" в начале структуры вашего пакета.
Вы делаете это, используя аргумент -classpath для javac.exe и java.exe.
Следует также спросить, как пакеты третьей стороны, которые вы используете, упакованы. Если они находятся в JAR, и я бы рекомендовал, чтобы они были у вас в одном, вы добавляете файл .jar в путь к классам:
java -classpath .;company.jar foo.bar.baz.YourClass
Google для "Java classpath". Здесь будут найдены ссылки, например .
Еще одна вещь: "import" не загружает классы. Все это позволяет вам печатать. Когда вы включаете оператор import, вам не нужно использовать полностью разрешенное имя класса в вашем коде - вы можете ввести "Foo" вместо "com.company.thing.Foo". Это все, что он делает.
Ответ 3
Похоже, что вы на правильном пути со своей структурой каталогов. Когда вы компилируете зависимый код, укажите аргумент -classpath
javac
. Используйте родительский каталог каталога com
, где com
, в свою очередь, содержит company/thing/YourClass.class
Ответ 4
У вас есть куча хороших ответов, поэтому я просто выброшу предложение. Если вы собираетесь работать над этим проектом более двух дней, загрузите eclipse или netbeans и создайте там свой проект.
Если вы, как правило, не программируете на Java, то помощь, которую он вам даст, будет неоценимой.
Не стоит скачивать/устанавливать 1/2 часа, если вы потратите на это всего 2 часа.
Оба имеют горячие клавиши/пункты меню для "Fix import", и вам больше не придется беспокоиться об импорте.
Ответ 5
Стандартный Java-загрузчик классов является ориентиром для структуры каталогов. Каждая запись в пути к классам - это каталог или файл jar (или zip файл, действительно), который затем ищет данный файл класса. Например, если ваш путь к классам ".; My.jar", он будет искать com.example.Foo в следующих местах:
./com/example/
my.jar:/com/example/
То есть, он будет выглядеть в подкаталоге с "измененным именем" пакета, где "." заменяется разделителем файлов.
Кроме того, следует отметить, что вы не можете вложить файлы .jar.
Ответ 6
Просто добавьте элемент pathpath (я имею в виду папку вашего родительского каталога) в меню "Системные переменные" и "Пользовательские переменные"...
Следуйте: Щелкните правой кнопкой мыши Мой компьютеp > Свойствa > Дополнительно > Переменные среды