Как скомпилировать Java-программу с .jar-библиотекой

Я не могу заставить javac распознать внешний .jar файл, чьи классы я пытаюсь расширить. У меня есть два файла в одном каталоге: TestConsole.java и acm.jar. Я компилирую из того же каталога, используя следующую команду:

javac -classpath .:acm.jar TestConsole.java

Но похоже, что javac просто игнорирует acm.jar. Это дает мне ошибку:

TestConsole.java:1: package acm does not exist
import acm.program;
          ^

Конечно, acm.program - это пакет в acm.jar. Все классы в acm.jar уже скомпилированы; Я просто хочу использовать их в своих классах, а не компилировать их.

Что я делаю неправильно?

Я запускаю это на Mac, и структура каталогов acm.jar представляется действительной: она содержит каталог acm/program, который имеет ConsoleProgram.class, единственный класс, который TestConsole расширяется.

javac -classpath ".:acm.jar" TestConsole.java тоже не работает.

Ответы

Ответ 1

Контрольный список:

  • ваши классы в acm.jar отображаются как:

    /ACM программа /CLASSX.class

    ACM/программа/CLASSY.class

    при декантировании с помощью jar tf acm.jar

  • Вы импортируете их как:

import acm.program.CLASSX;

или

import acm.program. *;

Ответ 2

javac -cp <jar you want to include>;<jar you want to include> <source.java> 

<jar you want to include>, если в том же каталоге указывается только имя jar, если нет, укажите полные или относительные пути

если несколько банок, разделяемых ,

замените ; на : на unix

Если возможно, используйте некоторую среду IDE, например Eclipse. Раньше я проводил много времени на подобных вещах, но в промышленности вы вряд ли когда-либо сделаете это таким образом.

Ответ 3

Выполняете ли вы эти команды на компьютере под управлением Windows? В Windows элементы класса path разделяются точкой с запятой, а не двоеточием. Итак:

javac -classpath .;acm.jar TestConsole.java

Другая возможность: структура acm.jar неверна. Недостаточно, чтобы файлы классов внутри были скомпилированы из файлов, объявляющих package acm.program - структура пакета также должна быть представлена ​​как иерархия каталогов, поэтому acm.jar должен содержать каталог acm и внутри него подкаталог program который содержит фактические файлы классов для классов, используемых в TestConsole.

Ответ 4

Я просто добавляю для людей, которые все еще ищут ответ на ту же проблему после успешной компиляции.

Во время компиляции используйте команду, предложенную выше @Michael Borgwardt:

javac -classpath .;acm.jar TestConsole.java

Для выполнения также вам нужно указать путь к классу:

java -classpath .;acm.jar TestConsole