Как вы заставляете javac перекомпилировать исходные файлы при изменении их зависимостей? - PullRequest
4 голосов
/ 23 февраля 2011

Кажется, я получаю ошибки во время выполнения в моем проекте при использовании javac для инкрементных сборок. Поддерживается ли этот тип рабочего процесса? Например, если A.java зависит от B.java, а B.java изменяется; будет javac перекомпилировать A.java, потому что его зависимость изменилась?

Сейчас я использую задачу компиляции javac ant для компиляции:

    <javac destdir="${classes.dir}"
            srcdir="${src.dir}"
            source="${javac.version}"
            debug="${javac.debug}"
            deprecation="${javac.deprecation}"
            includeantruntime="build.sysclasspath=last">
        <classpath refid="compile.classpath" />
        <classpath refid="junit.classpath" />
    </javac>

Ответы [ 3 ]

8 голосов
/ 23 февраля 2011

Поскольку вы используете муравей, проверьте задачу зависимость .

5 голосов
/ 23 февраля 2011

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

Муравей javacЗадача старается быть немного умнее, чтобы избежать компиляции всегда всего - она ​​перекомпилирует только те файлы, которые изменились (т.е. являются более новыми, чем их соответствующие файлы классов).Это не обращает внимания на случай, когда, возможно, изменилась зависимость какого-либо класса, и, следовательно, другие классы также должны быть перекомпилированы.

В моем текущем проекте я просто делаю ant clean всякий раз, когда у меня возникают проблемы с тестами(и, конечно, перед любым производственным развертыванием), который удаляет все файлы классов.Но, как сказал Ванза, есть задача depend, задача которой состоит в том, чтобы найти и удалить все классы, которые зависят от ваших измененных классов - запустите эту задачу перед задачей javac, и у вас все получится.

0 голосов
/ 23 февраля 2011

Зависит от того, что изменилось в B.java. Если ничего не изменилось, что повлияло на представление класса в A, тогда javac не нужно перекомпилировать A.java, чтобы изменения вступили в силу.

Тем не менее, если вы видите поведение, когда вы считаете, что старый код загружается и запускается, я бы более подозрительно относился к процессу развертывания / упаковки, чем к процессу компиляции. YMMV.

...