Подтвердить что ты не робот

Помощь с пакетами в 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:

Наконец - не уверен, почему он не работал раньше, но я очистил все файлы по всей структуре каталогов, и теперь он работает.

Спасибо

4b9b3361

Ответ 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 > Дополнительно > Переменные среды