Как скомпилировать несколько файлов Java, когда есть файлы Java в других пакетах
Я компилирую несколько файлов в каталоге (javac *.java), но у меня возникает проблема, когда я пытаюсь сделать это:
Я получаю ошибки компиляции, в которых говорится, что javac не может найти символ объекта.
У меня есть несколько пакетов, которые содержат файлы Java, необходимые для запуска основной программы. Но кажется, что попытка собрать их по одному не сработает. Он отлично работает в моей IDE, но мне интересно узнать, как это делается с помощью командной строки.
Основная программа находится в папке драйверов.
Я попытался скомпилировать файлы в порядке зависимости, но это не сработало.
3 ответа
Документация Javac предоставляет всю необходимую информацию. Однако может быть полезно использовать Ant или Maven для сборок командной строки.
На этой странице представлен хороший пример использования сначала javac, а затем Ant для создания простого проекта.
Вот пример проекта и как его можно скомпилировать с помощью javac.
Древовидная структура проекта такова:
.
├── build
└── src
├── attacks
├── drivers
│ └── Driver.java
└── exceptions
└── MyException.java
Есть две специальные директории - build
для содержания скомпилированных классов и src
содержать исходные файлы (могут быть в разных подкаталогах - пакетах).
Следующая команда компилирует весь проект и помещает результат в build
каталог.
javac -sourcepath src -d build src/**/*.java
-sourcepath src
указывает каталог src
как место, где весь источник может быть найден компилятором. -d build
options указывает компилятору, где разместить скомпилированные файлы.
вариант src/**/*.java
говорит компилятору, какие файлы на самом деле компилировать. В этом конкретном случае он сообщает javac посмотреть на два уровня вниз и выбрать все *.java на этом уровне.
Если есть *.java
файлы на уровнях, отличных от списка файлов, должны быть указаны. Для этого можно создать такой листинг как внешний файл и передать эти файлы как в параметре ввода для javac
,
Вот как это можно сделать в Linux/Unix:
find -name "*.java" > source.txt
Приведенная выше команда создает файл source.txt, который содержит полные пути для найденных файлов *.java. Для этого примера он содержит:
./src/drivers/Driver.java
./src/exceptions/MyException.java
Для того, чтобы скомпилировать проект со списком исходных файлов source.txt
можно использовать следующую команду:
javac -d build @source.txt
Обратите внимание, что @source.txt
указывается в конце, который сообщает компилятору, где искать список исходных файлов. Пожалуйста, обратите внимание, что -sourcepath
опция может быть опущена.
Вот как изменилась структура каталогов после выполнения вышеуказанной команды.
.
├── build
│ ├── drivers
│ │ └── Driver.class
│ └── exceptions
│ └── MyException.class
└── src
├── attacks
├── drivers
│ └── Driver.java
└── exceptions
└── MyException.java
Как можно наблюдать build
каталог теперь содержит файлы скомпилированных классов в соответствующих пакетах.
И, если вы хотите запустить его, предполагая, например, что Driver
имеет метод main
, следующая команда выполняет программу.
java -cp .:build:**/*.class drivers.Driver
Обратите внимание, что разделитель файлов :
(двоеточие) используется под Unix, для Windows измените его на ;
(точка с запятой).
Я собираю несколько файлов в каталоге (javac *.java)
Уже неправильно Это будет работать правильно только в том случае, если Java-классы отсутствуют в пакетах. Правильный способ сделать это заключается в следующем, где src
Имя каталога, в котором находятся все ваши каталоги пакетов:
cd src
javac package1/package2/*.java
javac package3/package4/package5/*.java
и т. д. для любого вашего макета пакета / каталога. каждый javac
командная строка скомпилирует все файлы в названном каталоге и все файлы.java в других пакетах / каталогах, от которых это зависит, которые еще не скомпилированы или устарели.
Смотрите документацию по инструменту для javac
,
Два варианта:
1) Используйте командную строку, чтобы указать все файлы для компиляции
2) Создайте файл со всеми именами файлов (возможно, выводом из find) и запустите javac @argfile