можливість javac компілювати всі файли Java під заданою каталогом рекурсивно


127

Я використовую компілятор 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?


2
Ви дійсно повинні ознайомитися з такими інструментами, як Мураха чи Мевен.
Лоран Пірейн

Цей пост може бути корисним stackoverflow.com/questions/864630/…
Gopi

Відповіді:


220

Я б також запропонував використовувати якийсь інструмент збирання ( Ant або Maven , Ant вже пропонується і простіше почати з нього) або IDE, який обробляє компіляцію (Eclipse використовує інкрементальну компіляцію із узгодженням стратегії, і вам навіть не доведеться обережно натиснути будь-які кнопки "Компілювати" ).

Використання Javac

Якщо вам потрібно спробувати щось для більшого проекту та не маєте належних інструментів збирання поруч, ви завжди можете використовувати невеликий трюк, який javacпропонує: імена класів для компіляції можна вказати у файлі. Вам просто потрібно передати ім'я файлу javacз @префіксом.

Якщо ви можете створити список усіх *.javaфайлів у вашому проекті, це легко:

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • Перевага полягає в тому, що це швидке і просте рішення.
  • Недолік полягає в тому, що вам доведеться регенерувати sources.txtфайл щоразу, коли ви створюєте нове джерело або перейменовуєте існуючий один файл, який легко забути (таким чином, схильний до помилок) і стомлюючим завданням.

Використання інструменту збирання

У довгостроковій перспективі краще використовувати інструмент, призначений для створення програмного забезпечення.

Використання мурахи

Якщо ви створюєте простий build.xmlфайл, який описує, як створити програмне забезпечення:

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

ви можете скласти все програмне забезпечення, виконавши таку команду:

$ ant
  • Перевага полягає в тому, що ви використовуєте стандартний інструмент збірки, який легко розширити.
  • Недолік - те, що вам потрібно завантажити, налаштувати та вивчити додатковий інструмент. Зауважте, що більшість IDE (як NetBeans та Eclipse) пропонують чудову підтримку для написання файлів збірки, тому вам не доведеться нічого завантажувати в цьому випадку.

Використання Maven

Мейвен не так банально налаштовувати і працювати, але навчитися цьому добре платить. Ось чудовий посібник для початку проекту протягом 5 хвилин .

  • Основна перевага (для мене) полягає в тому, що він також обробляє залежності, тому вам більше не потрібно буде завантажувати файли Jar і керувати ними вручну, і я вважаю це кориснішим для створення, упаковки та тестування великих проектів.
  • Недоліком є те, що він має круту криву навчання, і якщо плагіни Maven люблять придушувати помилки :-) Інша справа, що досить багато інструментів також працюють із сховищами Maven (як Sbt for Scala, Ivy for Ant, Graddle for Groovy) .

Використання IDE

Тепер, що може підвищити продуктивність вашої розробки. Є кілька альтернатив з відкритим кодом (наприклад, Eclipse та NetBeans , я віддаю перевагу колишній) і навіть комерційні (наприклад, IntelliJ ), які досить популярні та потужні.

Вони можуть керувати будівництвом проекту у фоновому режимі, тому вам не доведеться мати справу з усіма командними рядками Однак це завжди стане в нагоді, якщо ви знаєте, що насправді відбувається у фоновому режимі, щоб ви могли вишукувати випадкові помилки, як-от ClassNotFoundException.

Ще одна примітка

Для великих проектів завжди рекомендується використовувати IDE та інструмент побудови. Перший підвищує вашу продуктивність, тоді як другий дає можливість використовувати різні IDE з проектом (наприклад, Maven може генерувати дескриптори проектів Eclipse за допомогою простої mvn eclipse:eclipseкоманди). Більше того, мати проект, який можна протестувати / побудувати за допомогою команди одного рядка, легко представити новим колегам, наприклад, на сервері безперервної інтеграції. Шматок торту :-)


4
Під час використання javacбуло б краще вказати вихідний каталог. find -name "*.java" > sources.txt && javac -d bin @sources.txt. В іншому випадку файли * .class зберігаються в каталозі, де є джерела.
Максим Дмитрієв

1
Абсолютно вірно. Хоча, на мою думку, якщо хтось тільки почав займатися javac, поняття CLASSPATH, як запустити код java, як поводитися з пакетами, яка повинна бути кореневою папкою для роботи тощо, як правило, не зрозуміла. Таким чином я опустив вихідний реж. У будь-якому випадку, дякую за пропозицію!
rlegendi

6
Для користувачів Mac, які findfind . -name "*.java" > sources.txt.
стикаються

@MrDuk Що означає додавання знака "." робити? Це для пошуку в поточному каталозі?
Брейді Шихан

@BradySheehan почне пошук із заданого шляху. "." означає починати з поточного словника. Зауважте, що вам потрібно вказати шлях для знаходження (в OS X)
Kris

40
find . -name "*.java" -print | xargs javac 

Якийсь жорстокий, але працює як пекло. (Використовуйте лише для невеликих програм, це абсолютно не ефективно)


1
Якщо ви користуєтесь цим, врахуйте, find ... -print0а xargs -0 ...замість цього не
розбивайтесь

29

Якщо ваша оболонка підтримує це, чи буде щось подібне працювати?

javac com/**/*.java 

Якщо ваша оболонка не підтримує **, то можливо

javac com/*/*/*.java

працює (для всіх пакетів з 3 компонентами - адаптувати для більшої чи меншої кількості).


Я спробував використовувати це в командному рядку на вікнах 10. Може чи хто - небудь підтвердити , якщо він працює на Windows 10 або , якщо я роблю це неправильно , будь ласка
Ден

26

У звичайному випадку, коли ви хочете скласти весь ваш проект, ви можете просто поставити javac своїм основним класом і дозволити йому зібрати всі необхідні залежності:

javac -sourcepath . path/to/Main.java


Дуже простий метод, не покладається на зайві файли
посилання на

Це найкращий і найпростіший варіант для людей, які не мають багато часу для вивчення мурашок (як я)
Хамза Аббад

На жаль, це ліниво. Якщо ви не чіпайте Main.java, які ви , ймовірно, не тільки після створення другого файлу, нічого не отримує компілятор.
Том Хотін - тайклін

Тут не працює добре. Деякі залежності не перекомпілюються, незважаючи на те, що вони були змінені. @ TomHawtin-tackline Я намагався доторкнутися до головного, але нічого. Можливо, торкатися всіх потрібно. Вигляд незручного, хоча.
ммм

5

javac -cp "jar_path/*" $(find . -name '*.java')

(Я вважаю за краще не використовувати xargs, оскільки це може розділити їх і запустити javac кілька разів, кожен із підмножиною файлів java, деякі з яких можуть імпортувати інші, не вказані в тому ж командному рядку javac)

Якщо у вас є точка входу для App.java, найкращим є шлях від Freaker за допомогою -sourcepath. Він компілює всі інші потрібні файли Java, враховуючи залежність від імпорту. наприклад:

javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java

Ви також можете вказати клас-файл реж мети: -d target/.


3

Я б порадив вам навчитися використовувати мураш , який дуже добре підходить для цього завдання і його дуже легко зрозуміти і добре зафіксувати.

Вам просто потрібно визначити таку ціль у файлі build.xml:

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>

2

Я просто використовую make з простим makefile, який виглядає приблизно так:

JAVAC = javac -Xlint:unchecked
sources = $(shell find . -type f -name '*.java')
classes = $(sources:.java=.class)

all : $(classes)

clean :
        rm -f $(classes)

%.class : %.java
        $(JAVAC) $<

Він компілює джерела по одному і лише за необхідності перекомпілює.


1

Команда javac не дотримується рекурсивного процесу компіляції, тому ви маєте або вказати кожен каталог під час запуску команди, або надайте текстовий файл із каталогами, які ви хочете включити:

javac -classpath "${CLASSPATH}" @java_sources.txt

0

Я використовую це в проекті Xcode JNI для рекурсивної побудови моїх тестових класів:

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.