Почти каждый Java-проект, который я видел, использует Maven или Ant. Они прекрасные инструменты, и я думаю, что любой проект может использовать их. Но что же случилось с делать ? Он используется для различных не-Java проектов и может легко обрабатывать Java. Конечно, вам нужно скачать make.exe, если вы используете Windows, но Ant и Maven также не поставляются с JDK.
Есть ли какой-то фундаментальный недостаток в make при использовании с Java? Это только потому, что Ant и Maven написаны на Java?
make
. И иметь make-файл, который работает только в одной системе, не очень хорошо для кроссплатформенного языка.Ответы:
Основная проблема Make и Java заключается в том, что Make работает при условии, что у вас есть указанная зависимость, а затем правило для разрешения этой зависимости.
На базовом C, который обычно «для преобразования файла main.c в файл main.o, запустите« cc main.c ».
Вы можете сделать это в Java, но вы быстро чему-то научитесь.
Главным образом из-за того, что компилятор javac запускается медленно.
Разница между:
и
ночь и день.
Усугубить это с сотнями классов, и это просто становится несостоятельным.
Затем вы объединяете это с тем фактом, что Java имеет тенденцию организовываться как группы файлов в каталогах, против C и других, которые имеют тенденцию к более плоской структуре. Make не имеет прямой поддержки для работы с иерархиями файлов.
Make также не очень хорошо определяет, какие файлы устарели на уровне коллекции.
С помощью Ant он будет проходить и суммировать все файлы, которые устарели, а затем скомпилирует их за один раз. Make будет просто вызывать компилятор Java для каждого отдельного файла. Для того, чтобы make НЕ делал этого, требуется достаточно внешних инструментов, чтобы действительно показать, что Make не совсем соответствует задаче.
Вот почему появились альтернативы, такие как Ant и Maven.
источник
$?
автоматическую переменную, которая расширяется до «всех предпосылок, которые новее, чем цель». Существует также функция шаблонных правил с несколькими целями, которая запускает рецепт только один раз, чтобы обновить все.class
файлы. Объедините это с каким - то умным использованием файла / текстовые функции , такие как$(wildcard)
,$(shell)
,$(eval)
и вы можете научить Makefile , чтобы обнаружить сборки цели , разбросанную по вашей схеме директорий.Почтенная
make
программа достаточно хорошо обрабатывает отдельно скомпилированные языки, такие как C и C ++. Вы компилируете модуль, он использует#include
для извлечения текста других включаемых файлов и записывает один объектный файл в качестве вывода. Компилятор очень похож на систему за один раз, с отдельным шагом связывания, чтобы связать объектные файлы в исполняемый двоичный файл.Однако в Java компилятор должен фактически скомпилировать другие классы, с которыми вы импортируете
import
. Хотя было бы возможно написать что-то, что сгенерировало бы все необходимые зависимости из исходного кода Java, так что этоmake
будет создавать классы в правильном порядке по одному, это все равно не будет обрабатывать такие случаи, как циклические зависимости.Компилятор Java также может быть более эффективным, кэшируя результаты, скомпилированные другими классами, при компиляции других классов, которые зависят от результатов уже скомпилированных. Такого рода автоматическая оценка зависимостей на самом деле невозможна в
make
одиночку.источник
Вопрос основан на неверном предположении: нетривиальное число разработчиков делает использование
make
. См. Инструменты сборки Java: Ant vs. Maven . Что касается того, почему разработчик не будет использоватьmake
: многие разработчики либо никогда не использовалиmake
, либо использовали его и ненавидели его с огнем, который горит сильнее, чем тысяча солнц. Как таковые, они используют альтернативные инструменты.источник
make
имеет много «функций», которые могли иметь смысл, когда он был написан, но теперь больше похожи на ошибки, например, вы должны использовать символ табуляции, а не пробелы, в определенных местах. Подобные вещи, вероятно, не беспокоят людей, которые действительно опытны в этомmake
, но сводят нас с ума.make depend
кто-нибудь?)Фактически, make может обрабатывать перекомпиляцию одной командой из всех устаревших java-файлов. Измените первую строку, если вы не хотите компилировать все файлы в каталоге или хотите определенный порядок ...
источник
Все остальные ответы о технических достоинствах каждого из них являются правдой.
Ant
иMaven
может быть лучше подходит для Java, чем make, или, как указывает Хэнк Гэй, они могут и не :)Однако вы спросили, имеет ли значение, что Ant и Maven написаны на Java. Хотя в StackOverflow мы не учитываем такие мысли (закрытые! Не связанные с программированием! И т. Д.), Конечно же, ЧАСТЬ, ЧАСТЬ ВЕЩИ. На рельсах мы используем Rake, C dudes используют make, а в Java - Ant и Maven. Хотя разработчики Ant или Maven действительно будут заботиться о Java-разработчике, возможно, лучше, чем другие, есть еще один вопрос: для чего вы пишете задачи Ant? Ява. Если вы Java-разработчик, это легко.
Так что да, отчасти это использование инструментов, написанных на том языке, на котором вы работаете.
источник
make
Происходит из опыта работы в UNIX, поэтому инструменты создаются путем написания полезных компактных утилит и их конвейерной передачи. Вот почему большая часть сшивки выполняется с помощью команд оболочки.make
маленьких утилит Unix. GIT тоже дитя этого процесса. От себя лично, я бы не сказал, что это не лучше. Но это огромный сдвиг парадигмы для Java-программистов. Ant гораздо более созвучен образу мышления Java.Муравей и позже Maven были разработаны, чтобы решить некоторые головные боли, вызванные
Make
(при создании новых в процессе), это просто эволюция.С http://ant.apache.org/faq.html#history
Решают ли они что-нибудь или просто создают дополнительный формат для изучения, это субъективная тема. Правда в том, что в значительной степени история каждого нового изобретения: создатель говорит, что он решает множество проблем, а первоначальные пользователи говорят, что это достоинства.
Основным преимуществом, которое он имеет, является возможность интеграции с Java.
Я думаю, что подобная история была бы с,
rake
например.источник
Одной из основных проблем, решаемых Maven (и настройками Ant с поддержкой Ivy) над make, является автоматическое разрешение зависимостей и загрузка ваших файлов зависимостей.
источник
Я думаю, что наиболее вероятное объяснение состоит в том, что несколько факторов препятствовали использованию make в сообществе Java в критический период времени (конец 1990-х годов):
Короче говоря, хотя make наверняка можно использовать для проектов Java, был момент, когда он стал инструментом де-факто для сборки Java. Этот момент прошел.
источник
Создание сценариев, как правило, зависит от платформы. Предполагается, что Java не зависит от платформы. Поэтому наличие системы сборки, которая работает только на одной платформе для многоплатформенной исходной базы, является своего рода проблемой.
источник
Краткий ответ: потому что
make
это не хорошо. Даже на фронте C вы видите много альтернатив.Длинный ответ:
make
имеет несколько недостатков, которые делают его едва пригодным для компиляции C и совсем не подходящим для компиляции Java. Вы можете заставить его скомпилировать Java, если хотите, но ожидаете столкнуться с проблемами, некоторые из которых не имеют подходящего решения или обходного пути. Вот несколько из них:Разрешение зависимостей
make
по своей природе ожидает, что файлы будут иметь древовидную зависимость друг от друга, в которой один файл является результатом построения нескольких других. Это уже имеет неприятные последствия в C при работе с заголовочными файлами.make
требует,make
чтобы был сгенерирован специфичный включаемый файл для представления зависимости файла C от его заголовочных файлов, поэтому изменение последнего приведет к перестроению предыдущего. Однако, поскольку сам файл C не воссоздается (просто перестраивается), make часто требует указывать цель как.PHONY
. К счастью, GCC поддерживает автоматическое создание этих файлов.В Java зависимость может быть круговой, и в ней нет инструмента для автоматического создания зависимостей классов.
make
формате.ant
«SDepend
задача может, вместо того, чтобы прочитать файл класса непосредственно, определить , какие классы он импортирует, и удалить файл класса , если любой из них устарели. Без этого любая нетривиальная зависимость может привести к тому, что вы будете вынуждены использовать повторные чистые сборки, что исключает любые преимущества использования инструмента сборки.Пробелы в именах файлов
Хотя ни Java, ни C не поощряют использование пробелов в именах файлов исходного кода, в
make
этом может возникнуть проблема, даже если пробелы находятся в пути к файлу. Рассмотрим, например, если ваш исходный код существует вC:\My Documents\My Code\program\src
. Этого было бы достаточно, чтобы сломатьсяmake
. Это потому чтоmake
обрабатывает имена файлов как строки.ant
трактует пути как особые объекты.Сканирование файлов для сборки
make
требует явного указания, какие файлы должны быть созданы для каждой цели.ant
позволяет указать папку, которая будет автоматически проверяться на наличие исходных файлов. Это может показаться незначительным удобством, но учтите, что в Java каждому новому классу требуется новый файл. Добавление файлов в проект может быстро стать большой проблемой.И самая большая проблема с
make
:make зависит от POSIX
Девиз Java - «Компилировать один раз, запустить везде». Но ограничивать эту компиляцию системами на основе POSIX, в которых поддержка Java на самом деле является худшей, не является намерением.
Правила сборки в
make
основном являются небольшимиbash
скриптами. Несмотря на наличие портаmake
для Windows, для правильной работы он должен быть связан с портомbash
, который включает в себя уровень эмуляции POSIX для файловой системы.Это приходит в двух вариантах:
MSYS
который пытается ограничить трансляцию POSIX путями к файлам, и поэтому может иметь неприятные ошибки при запуске внешних инструментов, не предназначенных специально для него.cygwin
которая обеспечивает полную эмуляцию POSIX. Получающиеся программы, однако, имеют тенденцию полагаться на этот слой эмуляции.По этой причине в Windows стандартный инструмент сборки даже не является
make
, а скорееMSBuild
является инструментом, основанным на XML, в принципе ближе к немуant
.Напротив,
ant
он построен на Java, может работать везде и содержит внутренние инструменты, называемые «задачами», для манипулирования файлами и выполнения команд независимо от платформы. Он достаточно универсален, так что вы можете на самом деле легче создавать C-программу в Windows,ant
чем использоватьmake
.И последний минор:
Даже программы на C не используют make изначально
Вы можете не заметить этого изначально, но программы на C обычно не поставляются с
Makefile
. Они поставляются сCMakeLists.txt
илиbash
сценарием конфигурации, который генерирует фактическийMakefile
. Напротив, исходный код Java-программыant
поставляется сant
предварительно созданным сценарием. AMakefile
- это продукт других инструментов - вот почему самmake
по себе инструмент сборки не подходит.ant
является автономным и имеет дело со всем, что вам нужно для процесса сборки Java, без каких-либо дополнительных требований или зависимостей.Когда вы работаете
ant
на любой платформе, она просто работает (тм). Вы не можете получить это сmake
. Это невероятно зависит от платформы и конфигурации.источник
Если я не являюсь никем, предположение, что никто не (неправильно) использует make для java, неверно.
«Управление проектами с помощью GNU Make» (доступно в GFDL) содержит полную главу, посвященную использованию
make
с проектами Java.Поскольку он содержит длинный (и, надеюсь, справедливый) список плюсов и минусов использования make вместо других инструментов, вы можете захотеть взглянуть туда. (см .: http://oreilly.com/catalog/make3/book/ )
источник
Ant - это улучшенное конфигурирование XML по сравнению с Makefiles, а Maven - это улучшенное средство построения зависимостей по сравнению с Ant. Некоторые проекты используют все три. Я думаю, что в проектах JDK использовалось сочетание make-файлов и ant.
источник
Одна из важных причин заключается в том, что Ant и Maven (и большинство инструментов SCM, CI и IDE, ориентированных на Java) написаны на Java для разработчиков Java. Это упрощает интеграцию в среду разработки и позволяет другим инструментам, таким как серверы IDE и CI, интегрировать части библиотек ant / maven в инфраструктуру сборки / развертывания.
источник
Когда-то я работал над проектом Java, который использовал gmake. Мое воспоминание туманно, но IIRC нам было трудно разобраться со структурой каталогов пакетов, которую ожидает javac. Я также помню, что создавать файлы JAR было хлопотно, если у вас не было чего-то тривиального.
источник
ApacheAnt не похож на Make. Make рассказывает о зависимости между файлами и о том, как создавать файлы. Ant посвящен зависимостям между «задачами» и представляет собой скорее способ склеивания сценариев сборки.
это может помочь вам AntVsMake
источник
Ant и Maven подходят к графу зависимостей сборки и управлению им с более «современной» точки зрения ... Но, как говорит Оскар, они создали свои собственные проблемы, пытаясь решить старые проблемы с make.
источник
Я никогда не использовал GNU Make для проектов Java, но я использовал jmk . К сожалению, он не обновлялся с 2002 года.
Он имел некоторые специфичные для Java функциональные возможности, но был достаточно мал, чтобы включить его в исходный архив без значительного увеличения его размера.
В настоящее время я предполагаю, что у любого разработчика Java, с которым я делюсь кодом, установлен Ant.
источник