Java Classpath Issue - PullRequest
       10

Java Classpath Issue

0 голосов
/ 10 сентября 2010

У меня есть два класса:

MyApplicationБиблиотека

Библиотека уже скомпилирована в Library.class, и исходный код больше не доступен.Я сейчас пытаюсь скомпилировать MyApplication из источника.MyApplication зависит от библиотеки.Библиотека имеет имя пакета org.myCompany.Я попытался установить для моего classpath следующее:

set CLASSPATH=C:\java\project\org\myCompany\Library.class;.

, которое выдает следующее сообщение об ошибке компилятора javac:

MyApplication.java:33: cannot find symbol
symbol: class Library
location: class MyApplication
          Library theLibrary = new Library();

Поэтому я изменил свой classpath на:

set CLASSPATH=C:\java\project\;.

, который выдал точно такое же сообщение об ошибке.

Как настроить мой путь к классам Windows для включения файла Library.class?Должен ли он указывать на папку, содержащую подпапки org \ myCompany?Или указать прямо на файл класса?Или в папку, содержащую файл класса (даже если класс находится в пакете и принадлежит подпапке)?

Я выполняю echo% CLASSPATH% после моей команды set, и путь к классу устанавливается правильно.Я также создал файл ant build.xml и столкнулся с той же проблемой.Фактически, ant-verbose подтвердил, что мой classpath установлен правильно.

Ответы [ 6 ]

2 голосов
/ 10 сентября 2010

Прежде всего: использование переменной среды CLASSPATH очень не рекомендуется.Лучше всего для вас забыть, что оно существует.Используйте параметр командной строки -cp или аналогичные методы для установки classpath.

Во-вторых, каждая запись classpath представляет место, где загрузчик классов начнет искать .class в соответствии с иерархией пакета, т.е.ищите класс org.myCompany.Library в подпапке org/myCompany в любой записи пути к классам.

Поэтому, если

  • , вы добавляете запись пути к классам C:\java\project\
  • и существует файл класса C:\java\project\org\myCompany\Library.class
  • , который на самом деле является частью пакета org.myCompany (здесь заглавная буква имеет значение!)
  • и ваш класс MyApplication имеет import org.myCompany.Library;

Тогда это действительно должно работать.

0 голосов
/ 10 сентября 2010

Для работы classpath вам необходимо иметь структуру папок, которая соответствует иерархии пакетов. Поэтому, если ваш класс org.myCompany.Library, вы должны создать структуру вложенных папок C:\java\project\org\myCompany и поместить файл класса библиотеки в папку myCompany. Затем установите путь к классу C:\java\project\

0 голосов
/ 10 сентября 2010

Есть ли проблема с размещением Library в том же корневом проекте, где находится ваш MyApplication класс

Пример, если:

c:/project/org/company/MyApplication.class

Можете ли вы найти класс Library в:

C:/project/org/myCompany/Library.class

обратите внимание, что папки org/myCompany и org/company находятся в одной папке c:/project/.

Обратите внимание, что это решение работает для вас, если класс Library используется только вашим приложением.

Отредактировано Командная строка Windows утомительна, после установки classpath закройте и снова откройте командную строку, чтобы она могла видеть новое значение classpath.

0 голосов
/ 10 сентября 2010

Если вы скомпилировали файлы классов в другой каталог, classpath должен указывать, где находится файл .class.

set CLASSPATH=C:\java\project\;

правильно, если предположить, что файл класса находится в том же каталоге, что и исходный файл .java.

0 голосов
/ 10 сентября 2010

Если ваш файл .class отсутствует в jar-файле, укажите ваш путь к классу на родительский каталог, в котором находится пакет класса, например, для класса org.myCompany.Library, укажите ваш CP на каталог, содержащий org/myCompany.
Если ваш файл .class включен в какой-либо файл jar, добавьте полный путь к этому jar в ваш путь к классам.

0 голосов
/ 10 сентября 2010

Вы не можете добавить один класс в ваш путь к классам, как это. У вас есть 3 решения:

  • добавьте этот класс в путь других ваших скомпилированных классов (с учетом имен пакетов ваших каталогов)
  • добавьте корневой каталог этого класса в ваш путь к классам (в вашем случае "C: \ java \ project \")
  • добавить этот единственный класс в банку и добавить эту банку в путь к классам

Для вашей проблемы третий вариант более чистый: внешние зависимости обычно упаковываются в файлы jar.

...