Вопрос:

Помогите с пакетами в java - импорт не работает

java import packages

150830 просмотра

6 ответа

15861 Репутация автора

Я разработчик 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 

в родительском каталоге - и все работало нормально.

Я могу получить тестовое приложение для компиляции, но это не приведет к его сокращению, когда мне придется интегрировать его в производственный код. Все еще ищу помощь.

РЕДАКТИРОВАТЬ:

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

Спасибо

Автор: Tim Источник Размещён: 10.03.2009 06:36

Ответы (6)


5 плюса

231573 Репутация автора

Похоже, вы находитесь на правильном пути со своей структурой каталогов. Когда вы компилируете зависимый код, укажите -classpathаргумент javac. Используйте родительский каталог comкаталога, где com, в свою очередь, содержитсяcompany/thing/YourClass.class

Автор: erickson Размещён: 10.03.2009 06:41

10 плюса

278969 Репутация автора

Да, это проблема 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». Это все, что он делает.

Автор: duffymo Размещён: 10.03.2009 06:41

5 плюса

55350 Репутация автора

Вы получили кучу хороших ответов, поэтому я просто выкину предложение. Если вы собираетесь работать над этим проектом более 2 дней, загрузите eclipse или netbeans и создайте там свой проект.

Если вы не являетесь Java-программистом, то помощь, которую он вам даст, будет неоценимой.

Это не стоит полчаса загрузки / установки, если вы тратите на это только 2 часа.

Оба имеют горячие клавиши / пункты меню для «Исправления импорта», поэтому вам больше не придется беспокоиться об импорте.

Автор: Bill K Размещён: 10.03.2009 06:49

3 плюса

350 Репутация автора

Стандартный загрузчик классов Java является сторонником структуры каталогов. Каждая запись в classpath является каталогом или файлом jar (или действительно zip-файлом), который затем ищет указанный файл класса. Например, если ваш classpath - «.; My.jar», он будет искать com.example.Foo в следующих местах:

./com/example/
my.jar:/com/example/

То есть он будет искать в подкаталоге с «измененным именем» пакета, где «.» заменяется разделителем файлов.

Также следует отметить, что вы не можете вкладывать файлы .jar.

Автор: krakatoa Размещён: 10.03.2009 07:30

47 плюса

163947 Репутация автора

Хорошо, просто чтобы уточнить вещи, которые уже были опубликованы.

У вас должен быть каталог 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

Это делает вещи более ясными?

Автор: Michael Myers Размещён: 10.03.2009 07:48

0 плюса

884 Репутация автора

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

Автор: cbinder Размещён: 10.07.2011 10:00
Вопросы из категории :
32x32