Помогите с пакетами в java - импорт не работает
Я разработчик C++ - не 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 и т. Д., Но у меня тоже есть полностью все испортил или пропускаю что-то еще.
РЕДАКТИРОВАТЬ спасибо за предложения - я пробовал classpath ранее. Это не помогает.
Я пробовал компилировать
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 и скомпилировал его в родительском каталоге. Я сейчас совершенно сбит с толку.
скомпилирован без указания пути к классу - просто
javac *.java
в родительском каталоге - и все работало нормально.
Я могу получить тестовое приложение для компиляции, но это не приведет к его сокращению, когда мне придется интегрировать его в производственный код. Все еще ищу помощь.
РЕДАКТИРОВАТЬ:
Наконец - не уверен, почему это не сработало раньше - но я очистил все файлы по всей структуре каталогов, и теперь это работает.
Спасибо
6 ответов
Хорошо, просто чтобы уточнить вещи, которые уже были опубликованы.
Вы должны иметь каталог com
, содержащий каталог company
, содержащий каталог example
, содержащий файл MyClass.java
,
Из папки, содержащей com
, бежать:
$ javac com \ company \ example \ MyClass.java
Затем:
$ java com.company.example.MyClass Привет из 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 Привет из testpackage.TestPackageClass! Теперь доступ к testpackage2.MyClass
Это делает вещи более ясными?
Да, это проблема classpath. Вы должны сообщить компилятору и среде выполнения, что каталог, в котором находятся ваши файлы.class, является частью CLASSPATH. Каталог, который вам нужно добавить, является родительским для каталога "com" в начале структуры вашего пакета.
Это делается с помощью аргумента -classpath для javac.exe и java.exe.
Также следует спросить, как упакованы сторонние классы, которые вы используете. Если они находятся в JAR, и я бы порекомендовал, чтобы они были в одном, вы добавляете файл.jar в classpath:
java -classpath .;company.jar foo.bar.baz.YourClass
Google для "Java classpath". Он найдет такие ссылки.
Еще одна вещь: "импорт" не загружает классы. Все, что он делает, это спасает вас от набора текста. Когда вы включаете оператор импорта, вам не нужно использовать полностью разрешенное имя класса в вашем коде - вы можете ввести "Foo" вместо "com.company.thing.Foo". Это все, что он делает.
Похоже, вы находитесь на правильном пути со своей структурой каталогов. Когда вы компилируете зависимый код, укажите -classpath
аргумент javac
, Используйте родительский каталог com
каталог, где com
в свою очередь, содержит company/thing/YourClass.class
Вы получили кучу хороших ответов, поэтому я просто выкину предложение. Если вы собираетесь работать над этим проектом более 2 дней, загрузите eclipse или netbeans и создайте там свой проект.
Если вы не являетесь Java-программистом, то помощь, которую он вам даст, будет неоценимой.
Это не стоит полчаса загрузки / установки, если вы тратите на это только 2 часа.
Оба имеют горячие клавиши / пункты меню для "Исправления импорта", поэтому вам больше не придется беспокоиться об импорте.
Стандартный загрузчик классов Java является сторонником структуры каталогов. Каждая запись в classpath является каталогом или файлом jar (или действительно zip-файлом), который затем ищет указанный файл класса. Например, если ваш classpath - ".; My.jar", он будет искать com.example.Foo в следующих местах:
./com/example/
my.jar:/com/example/
То есть он будет искать в подкаталоге с "измененным именем" пакета, где "." заменяется разделителем файлов.
Также следует отметить, что вы не можете вкладывать файлы.jar.
Просто добавьте запись пути к классу (я имею в виду расположение вашего родительского каталога) в меню Системные переменные и пользовательские переменные... Следуйте: Щелкните правой кнопкой мыши Мой компьютер> Свойства> Дополнительно> Переменные среды