Как скомпилировать несколько файлов 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

Другие вопросы по тегам