Как скомпилировать несколько java файлов, когда есть Java файлы в других пакетах

Я компилирую несколько файлов в каталоге (javac *.java), но у меня есть проблема, когда я пытаюсь это сделать:

Я получаю ошибки компиляции, говоря, что javac не может найти символ объекта.

У меня есть несколько пакетов, содержащих java файлы, необходимые для запуска основной программы. Но похоже, что попытка скомпилировать их по одному не сработает. Он отлично работает в моей среде разработки, но мне интересно узнать, как это делается с помощью командной строки.

Основная программа находится в папке с драйверами.

Я попытался скомпилировать файлы в порядке зависимости, но это не сработало. this is a screenshot of the folders

Ответы

Ответ 1

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 сообщает компилятору, куда поместить скомпилированные файлы.

Опция 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 его можно изменить на ; (точка с запятой).

Ответ 2

Я компилирую несколько файлов в каталоге (javac *.java)

Неправильно. Это будет работать только в том случае, если классы Java не находятся в пакетах. Правильный способ сделать это выглядит следующим образом, где src - это имя каталога, в котором находятся все каталоги пакетов:

cd src
javac package1/package2/*.java
javac package3/package4/package5/*.java

и т.д. для любого вашего макета пакета/каталога. Каждая командная строка javac будет скомпилировать все файлы в названном каталоге и все .java файлы в других пакетах/каталогах, от которых он зависит, которые еще не скомпилированы или устарели.

См. документацию инструмента для javac.

Ответ 3

два варианта:

1) Используйте командную строку, чтобы указать все файлы для компиляции

2) Создайте файл со всеми именами файлов (вывод из поиска, возможно) и запустите javac @argfile