Ant: использование набора файлов с задачей javac - PullRequest
3 голосов
/ 15 октября 2011

Я хочу использовать FileSet, чтобы точно указать, какие файлы я хочу скомпилировать с помощью задачи Javac. Я не хочу никакого скрытого поведения. Однако мои попытки провалились. Вот что у меня так далеко:

FileSet, который содержит все мои исходные файлы.

<fileset id="srcfiles" dir="${srcdir}">
    <include name="**/*.java"/>
</fileset>

И цель, которая пытается передать его javac.

<target name="build">
    <javac srcdir=".">
        <fileset refid="srcfiles"/>
    </javac>
</target>

Это дает мне эту ошибку: javac doesn't support the nested "fileset" element.

После прочтения документации по Ant я попытался изменить самый внутренний тег с fileset на sourcepath. Это сработало в том смысле, что файлы были скомпилированы, но все равно выдало ошибку: srcfiles doesn't denote a path. Я думаю, что источник был скомпилирован только из-за неявных правил.

Как я могу явно указать javac, какие отдельные файлы я хочу скомпилировать? Или это просто не так, как муравей должен работать? Я пришел из C ++, где идентификация исходных файлов является важной частью процесса сборки. Однако, учитывая требования Java к именованию файлов и структуре каталогов, возможно, неявное правило шаблона **/*.java охватывает все варианты использования.

Ответы [ 3 ]

4 голосов
/ 15 октября 2011

Руководство по муравьям для javac гласит:

Если вы хотите скомпилировать только явно указанные файлы и отключить механизм поиска по умолчанию в javac, вы можете сбросить атрибут sourcepath:

<javac sourcepath="" srcdir="${src}"
       destdir="${build}" >
    <include name="**/*.java"/>
    <exclude name="**/Example.java"/>
</javac>

Хотя я не думаю, что это хорошая идея.В хорошо спроектированном проекте все файлы в данном каталоге (или в наборе каталогов) должны быть скомпилированы.Файлы, которые не должны быть скомпилированы, вообще не должны быть там или должны находиться в отдельном каталоге.

1 голос
/ 15 октября 2011

Мышление в терминах C / C ++ в этом случае бесполезно. В C / C ++ у вас обычно есть Makefile, где вы перечисляете все свои файлы для компиляции, и каждый файл *.c или *.cc - с точки зрения компилятора - независимый друг от друга.

Совершенно наоборот верно для Java: если выдаст только один файл для компилятора Java, и этот класс ссылается на что-то else , то компилятор хочет увидеть это «else» в двоичном виде. Компилятор попробует три вещи:

  • Это 'else' в какой-то библиотеке в classpath - если так, то эта вещь используется, потому что она уже скомпилирована
  • Это 'else' в пути назначения компилятора - возможно, он уже скомпилирован из исходного кода, поэтому просто возьмите его
  • Это «что-то еще», где исходный файл можно найти в исходном пути компилятора - если так, то сначала скомпилируйте его, а затем вернитесь к реальной задаче.

Это немного упрощено, но уже показывает большинство точек, в которых C / C ++ просто отличается:

  • Исходные файлы не независимы друг от друга.
  • Компилятор может захотеть скомпилировать больше вещей, чем вы можете себе представить как новичок.
  • Многие из этих автоматических вещей работают только потому, что / если компилятор может угадать соответствие между .class файлами и .java файлами.
  • В Java не так много аргументов для компилятора. И все эти настройки применяются к каждому исходному файлу. В C / C ++, с другой стороны, вы можете иметь несколько килобайт define аргументов, настроек оптимизации и т. Д., Возможно, для каждого исходного файла.
  • Разработчик Java не хочет микроуправлять компилятором Java - он хочет скомпилировать все файлы в исходном каталоге.
  • Java-разработчик не хочет определять точные и формальные зависимости между исходными файлами - машина лучше справляется с такой задачей.

Все это сводится к тому, как работают Ant, Maven и любая приличная система сборки в Java: скомпилируйте полные исходные каталоги. Так что да, именно так Ant хочет работать.

1 голос
/ 15 октября 2011

Что ты хочешь?Скомпилировать весь код * .java из одного каталога?Или просто скомпилировать один файл?

Если вы хотите скомпилировать весь исходный код Java?Затем вы должны определить, где находится ваш файл исходного кода, а затем вы должны определить, где находится ваш каталог сборки.Этот каталог сборки предназначен для файла * .class после компиляции кода Java.

Самый простой способ - сначала создать один файл build.properties . В этом файле вы можетеопределить, где находится каталог с исходным кодом, где находится каталог сборки и т. д. Это простой пример build.properties file

# Source Code Properties ---------------------------
project.dir=.
src.dir=${folder.project}/src
dist.dir=${folder.project}/dist
build.dir=${folder.project}/build
test.dir=${folder.project}/testing

А затем в вашем build.xml файл вы можете скомпилировать свой код Java следующим образом:

<!-- define build.properties file -->
<property file="build.properties" />

<target name="compile" description="Compile all java code from src dir">
    <javac  srcdir="${src.dir}" 
            destdir="${build.dir}" 
     />
</target>

С помощью этой задачи муравья вы можете скомпилировать весь свой код Java в каталоге src в build каталог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...