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, поскольку он должен содержать необходимую информацию.