Помогите с пакетами в java - импорт не работает - PullRequest
28 голосов
/ 10 марта 2009

Я разработчик на 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 и т. Д., Но либо я все испортил, либо мне что-то не хватает.

EDIT спасибо за предложения - я пробовал 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.

EDIT

Я получил код клиента для компиляции и запуска, если использовал полное имя MyClass и скомпилировал его в родительском каталоге. Я сейчас совершенно сбит с толку.

скомпилировано без указания пути к классу - просто

javac *.java 

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

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

EDIT:

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

Спасибо

Ответы [ 6 ]

46 голосов
/ 10 марта 2009

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

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

Делает ли это что-то яснее?

10 голосов
/ 10 марта 2009

Да, это проблема пути к классам. Вы должны сообщить компилятору и среде выполнения, что каталог, в котором находятся ваши файлы .class, является частью CLASSPATH. Каталог, который вам нужно добавить, является родителем каталога «com» ​​в начале структуры вашего пакета.

Это делается с помощью аргумента -classpath для javac.exe и java.exe.

Также следует спросить, как упакованы используемые вами сторонние классы. Если они находятся в JAR, и я бы порекомендовал, чтобы они были в одном, вы добавляете файл .jar в classpath:

java -classpath .;company.jar foo.bar.baz.YourClass

Google для "Java classpath". Он найдет ссылки вроде this .

Еще одна вещь: «импорт» не загружает классы. Все, что он делает, это спасает вас от набора текста. Когда вы включаете оператор импорта, вам не нужно использовать полностью разрешенное имя класса в вашем коде - вы можете ввести «Foo» вместо «com.company.thing.Foo». Это все, что он делает.

5 голосов
/ 10 марта 2009

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

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

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

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

5 голосов
/ 10 марта 2009

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

3 голосов
/ 10 марта 2009

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

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

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

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

0 голосов
/ 10 июля 2011

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

...