Помогите с пакетами в 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.

Просто добавьте запись пути к классу (я имею в виду расположение вашего родительского каталога) в меню Системные переменные и пользовательские переменные... Следуйте: Щелкните правой кнопкой мыши Мой компьютер> Свойства> Дополнительно> Переменные среды

Другие вопросы по тегам