Я использую компилятор javac для компиляции файлов java в моем проекте. Файлы распределены по несколько пакетов , как это: com.vistas.util
, com.vistas.converter
, com.vistas.LineHelper
, com.current.mdcontect
.
В каждом из этих пакетов есть несколько файлов java. Я использую javac вот так:
javac com/vistas/util/*.java com/vistas/converter/*.java
com.vistas.LineHelper/*.java com/current/mdcontect/*.java
(в одной строке)
Вместо того, чтобы указывать так много путей, как я могу попросить компилятор рекурсивно скомпилировать все java-файлы из родительского каталога com?
Ответы:
Я бы также предложил использовать какой-то инструмент сборки ( Ant или Maven , Ant уже предлагается, и с ним проще начать) или IDE, которая обрабатывает компиляцию (Eclipse использует инкрементную компиляцию со стратегией согласования, и вам даже не нужно нажимайте любые кнопки "Compile" ).
Использование Javac
Если вам нужно попробовать что-то для более крупного проекта и у вас нет подходящих инструментов для сборки поблизости, вы всегда можете использовать небольшую уловку, которая
javac
предлагает: имена классов для компиляции могут быть указаны в файле. Вам просто нужно передать имя файлаjavac
с@
префиксом.Если вы можете создать список всех
*.java
файлов в своем проекте, это просто:sources.txt
файл каждый раз, когда вы создаете новый источник или переименовываете один существующий файл, что легко забыть (а значит, подвержено ошибкам) и утомительно.Использование инструмента сборки
В конечном итоге лучше использовать инструмент, предназначенный для создания программного обеспечения.
Использование Ant
Если вы создадите простой
build.xml
файл, описывающий, как собрать программное обеспечение:вы можете скомпилировать все программное обеспечение, выполнив следующую команду:
Использование Maven
Maven не так уж и прост в настройке и работе, но изучение его стоит хорошо. Вот отличное руководство, чтобы начать проект за 5 минут .
Использование IDE
Вот что может повысить продуктивность разработки. Есть несколько альтернатив с открытым исходным кодом (например, Eclipse и NetBeans , я предпочитаю первый) и даже коммерческие (например, IntelliJ ), которые довольно популярны и мощны.
Они могут управлять построением проекта в фоновом режиме, поэтому вам не нужно заниматься всеми вещами командной строки. Тем не менее, это всегда удобно, если вы знаете, что на самом деле происходит в фоновом режиме, чтобы вы могли отслеживать случайные ошибки, такие как
ClassNotFoundException
.Еще одно примечание
Для более крупных проектов всегда рекомендуется использовать IDE и инструмент сборки. Первый повышает вашу продуктивность, а второй позволяет использовать с проектом различные IDE (например, Maven может сгенерировать дескрипторы проекта Eclipse с помощью простой
mvn eclipse:eclipse
команды). Более того, имея проект, который можно протестировать / построить с помощью однострочной команды, легко представить новым коллегам, например, на сервере непрерывной интеграции. Кусок пирога :-)источник
javac
лучше указать выходной каталог.find -name "*.java" > sources.txt && javac -d bin @sources.txt
, В противном случае файлы * .class сохраняются в каталог, где находятся исходные коды.javac
, концепция тогоCLASSPATH
, как запускать кодjava
, как работать с пакетами, которые должны быть корневой папкой для запуска, и т.д. обычно не ясны. Таким образом, я пропустил выходной каталог. В любом случае спасибо за предложение!find
командаfind . -name "*.java" > sources.txt
.
Довольно жестоко, но чертовски работает. (Используйте только в небольших программах, это абсолютно неэффективно)
источник
find ... -print0
иxargs -0 ...
вместо этого неЕсли ваша оболочка поддерживает это, будет ли что-то подобное работать?
Если ваша оболочка не поддерживает
**
, то возможноработает (для всех пакетов с 3-мя компонентами - адаптироваться более-менее).
источник
В обычном случае, когда вы хотите скомпилировать весь свой проект, вы можете просто предоставить javac вашему основному классу и позволить ему скомпилировать все необходимые зависимости:
javac -sourcepath . path/to/Main.java
источник
Main.java
, чего вы, вероятно, не сделаете сразу после создания второго файла, компилятор не получит ничего другого.javac -cp "jar_path/*" $(find . -name '*.java')
(Я предпочитаю не использовать xargs, потому что он может разделять их и запускать javac несколько раз, каждый с подмножеством java-файлов, некоторые из которых могут импортировать другие, не указанные в той же командной строке javac)
Если у вас есть точка входа в App.java, лучше всего подойдет -sourcepath. Он компилирует все остальные файлы Java, которые ему нужны, в соответствии с зависимостями импорта. например:
javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java
Вы также можете указать класс-файл реж цели:
-d target/
.источник
Я бы посоветовал вам научиться использовать ant , который очень хорошо подходит для этой задачи, очень прост для понимания и хорошо документирован.
Вам просто нужно определить такую цель в файле build.xml:
источник
Я просто использую make с простым make-файлом, который выглядит так:
Он компилирует исходники по одному и перекомпилирует только при необходимости.
источник
Команда javac не следует рекурсивному процессу компиляции, поэтому вы должны либо указать каждый каталог при запуске команды, либо предоставить текстовый файл с каталогами, которые вы хотите включить:
источник
Я использовал это в проекте Xcode JNI для рекурсивного создания моих тестовых классов:
источник