javac не распознает внешние библиотеки - PullRequest
0 голосов
/ 07 мая 2019

У меня есть рабочая версия моего проекта в Eclipse.

Я экспортировал проект в качестве исполняемой фляги.Извлек (после преобразования в .zip) и попытался скомпилировать конкретный java-файл из командной строки (делаю так, поскольку у меня есть требования к проекту, где входной параметр внутри этого конкретного файла может быть изменен и перекомпилирован / запущен пользователями, которые неесть Eclipse)

Я использовал несколько внешних библиотек (например, json-simple, gson и т. д.). Они не распознаются во время компиляции.Но если я запускаю файл класса (из скомпилированной версии Eclipse), он выполняется правильно

a) Пытается скомпилировать из корневой папки (используя имя пакета) javac packageName.javaFileName.java b) и заходит внутрьпакет и скомпилирован напрямую.javac javaFileName.java

Часть a) вообще не компилируется, говоря classNotFound.Часть b) начала компиляцию, но вызвала ошибку, когда ни одна из внешних библиотек не была распознана (Получение -> ошибка: не удается найти символ для мест, где используется код / ​​импорт внешней библиотеки)

1 Ответ

0 голосов
/ 07 мая 2019

a) Попробовал скомпилировать из корневой папки (используя имя пакета) javac packageName.javaFileName.java b) и зашел внутрь пакета и скомпилировал напрямую.javac javaFileName.java

Часть a) вообще не компилируется, говоря classNotFound.

Да.javac требует, чтобы вы указали путь файловой системы к (первому) источнику (ам) для компиляции.Вместо этого вы, кажется, прикрепили .java к концу желаемого полного имени класса.Вероятно, вы хотите скомпилировать из корня распакованного jar-файла, указав правильный путь:

javac [options] package/name/className.java

для класса package.name.className.(Вы также можете скомпилировать из другого рабочего каталога, если укажете соответствующую опцию, как описано ниже.)

Часть b) начала компиляцию, но вызвала ошибку, когда ни одна из внешних библиотек не была распознана.(Получение -> ошибка: не удается найти символ для мест, где используется код / ​​импорт внешней библиотеки)

Если компилируемый класс зависит от других, которые также должны быть скомпилированы, тоjavac, вероятно, подаст аналогичную жалобу на них.Либо скомпилируйте из корня (как в (а)), либо укажите путь к исходному корню с помощью опции -sourcepath.В любом случае, нет причин спускаться в исходное дерево для компиляции.

Но внешние библиотеки на самом деле являются отдельным, хотя и связанным, вопросом.Вам не нужно их компилировать, но вам нужно указать javac, чтобы использовать их в качестве источников классов.Это можно сделать с помощью параметра -classpath, который можно сократить до -cp.Если они были упакованы в саму банку (то есть «толстую банку»), то это должно быть довольно просто, что-то вроде этого:

javac -cp .:lib/dependency1.jar:lib/dependency2.jar package/name/className.java

Часть «lib» может отличаться, и разделитель определенно отличаетсяв зависимости от ОС (в Windows это ;, тогда как в Mac / Linux / Solaris это :, как показано).

Если внешние библиотеки были , а не упакованы вВ этом случае процедура будет такой же, но у вас может возникнуть более сложная задача: найти нужные банки.Кроме того, такая банка, вероятно, не работает, если вы переместите ее на другую машину.Тем не менее, вам, вероятно, следует заглянуть в META_INF / MANIFEST.MF, поскольку он должен содержать необходимую информацию.

...