Замена build.xml на Build.java - использование библиотек Java и Ant в качестве системы сборки

Я разочаровался в альтернативах Ant на основе Groovy. AntBuilder не работает из Eclipse, плагин Groovy для Eclipse разочаровывает, а Gradle просто еще не готов.

В документации Ant есть раздел «Использование задач Ant вне Ant», в котором рассказывается, как использовать библиотеки Ant из кода Java. Вот еще один пример:

http://www.mail-archive.com/[email protected]/msg16310.html

Теоретически кажется достаточно простым заменить build.xml на Build.java. Документация Ant намекает на некоторые недокументированные зависимости, которые мне придется обнаружить (недокументированные с точки зрения использования Ant из Java).

Учитывая уровень разочарования в сценариях Ant, мне интересно, почему этого не было сделано раньше. Возможно, у него есть и не очень хорошая система сборки.

Кто-нибудь пробовал писать файлы сборки на Java с помощью библиотек Ant?


person Dean Schulze    schedule 09.06.2009    source источник
comment
Почему вы еще не считаете Gradle готовым?   -  person tronda    schedule 30.06.2009
comment
+1 Я тоже собираюсь это сделать. Муравейник утомляет.   -  person amarillion    schedule 27.10.2009
comment
Для всех, кого это беспокоит ... есть более широкое обсуждение с дополнительной информацией здесь: ant.1045680.n5.nabble.com/   -  person ricosrealm    schedule 10.02.2012


Ответы (6)


Наша система сборки в первую очередь основана на том, что вы описываете, и действительно работает очень хорошо. Мы используем задачи Ant (особенно задачи манипулирования файлами) из пользовательских программ Java, которые собирают приложение, используя автоматическое обнаружение компоновки модулей приложения на основе соглашений.

Вам может потребоваться некоторый клей Ant XML, чтобы делать такие вещи, как компиляция самих сценариев сборки и фактический вызов java для выполнения сборки, но это второстепенно.

Java не только более читабельна, чем Ant, особенно когда дело касается условного выполнения, но и намного быстрее. Наша сборка на основе Ant раньше занимала минуту или около того, чтобы собрать EAR, теперь версия на основе java занимает около 5 секунд.

person skaffman    schedule 10.06.2009
comment
Да, я видел, где было бы удобно использовать небольшой скрипт Ant для создания и выполнения Build.java. У меня могут быть разные цели в build.xml для передачи различных аргументов в java Build arg1 arg2 ... в соответствии с различными целями, которые будут у вас в большем build.xml. Обнаружили ли вы какие-либо недокументированные / неожиданные зависимости при использовании Ant из Java, т.е. иметь проект с целевыми объектами? - person Dean Schulze; 10.06.2009
comment
Да, задачи Ant требуют определенного количества сантехники, но их легко обмануть. Мы закончили тем, что создали подклассы каждой задачи Ant, которую хотели использовать, предоставив более удобный и гибкий API для использования скриптов сборки и скрывая механизм внедрения таких вещей, как Project. Ничего такого, что вызывало бы у нас проблемы. - person skaffman; 10.06.2009
comment
Звучит здорово. Планируете ли вы открыть для него исходный код или хотя бы дать общий обзор вашей системы сборки? - person Dean Schulze; 10.06.2009
comment
Как вы обрабатываете зависимости и гарантируете, что данная зависимость выполняется только один раз? Например, если у меня есть цель тестирования и цель компиляции, и обе имеют зависимость от цели подготовки, как вы гарантируете, что при запуске теста, который зависит как от компиляции, так и от подготовки, подготовка вызывается только один раз? (Я понимаю, что пример тривиален, но надеюсь, что основная мысль понятна). - person Yishai; 10.06.2009
comment
Я не занимаюсь этим, потому что это не декларативная сборка, как у сценария Ant, а процедурная программа. Я склонен обнаруживать, что скрипты Ant любой сложности становятся все более и более процедурными, а Ant в этом не очень хорош. Что касается открытого исходного кода, я об этом подумал. В настоящее время он довольно сильно привязан к нашей конкретной среде, поэтому я не уверен, сколько работы потребуется для его извлечения. - person skaffman; 10.06.2009
comment
Гарантировать, что любое количество зависимостей (независимо от их сложности) выполняется только один раз, тривиально: используйте логическое значение. Я не могу придумать, что вы можете сделать с xml, что вы не можете сделать лучше и проще с Java, когда дело доходит до управления процессом сборки. - person Dean Schulze; 10.06.2009
comment
С помощью ant вы можете принудительно выполнить выполнение (с помощью antcall), а также полагаться на структуру зависимостей. Это означает, что для каждой вызываемой задачи вам понадобится оболочка. Я бы назвал это нетривиальным. - person Yishai; 11.06.2009

У вас была прекрасная идея. У Cliff Click была похожая идея: http://blogs.azulsystems.com/cliff/2008/01/i-hate-makefile.html.

Если вы пройдете через это, я советую вам сделать его как можно более простым, чтобы ваша система сборки не нуждалась в самой [нетривиальной] системе сборки.

person Ron    schedule 10.06.2009
comment
Файлов Build.java не должно быть больше, чем файлов build.xml для любого данного проекта. В большинстве случаев Build.java на верхнем уровне - это все, что нужно. Моя концепция заключается в том, чтобы просто использовать Ant из Java, а не из файла xml. - person Dean Schulze; 10.06.2009
comment
Ссылка на блог Клиффа не работает, но я нашел build.java от Клиффа на github: github.com/edwardw/high-scale-java-lib/blob/master/build.java - person Kevin Krouse; 09.11.2017

Учитывая, что Java скомпилирована, это своего рода проблема курицы и яйца. Вам необходимо создать свой Build.java, чтобы построить свой проект.

В настоящее время Ant поддерживает встроенные сценарии с использованием BeanShell, Groovy и ряда других, что действительно может помочь уменьшить потребность в этом.

РЕДАКТИРОВАТЬ: В ответ на многочисленные комментарии Дина, если ваша сборка состоит строго из длинного цикла, то вам действительно не нужен скрипт сборки ant. Однако сила сценария сборки заключается в том, что он гарантирует, что зависимости выполняются только один раз, при этом допускаются множественные точки входа, что далеко не тривиально, если вы откатываете свои собственные.

Если вам не нравится формат XML, вы не одиноки, с вами согласен автор ANT. Однако, если ваш взгляд на процесс сборки - это то, что можно запустить из вашей IDE в качестве единственной точки запуска, я бы сказал, что ваши потребности сборки довольно просты.

EDIT2: я поддержал ответ skaffman, потому что он напрямую связан с вопросом. В комментариях мы, кажется, согласны с тем, что подход хорош для процедурной сборки, но не будет работать для декларативной, и что вам понадобится хотя бы немного ANT xml, чтобы начать работу с вашим Build.java, чтобы избежать курицы и проблема с яйцом. Похоже, в этом вся суть дела.

person Yishai    schedule 09.06.2009
comment
Никаких проблем с курицей и яйцом. Создайте и выполните Build.java из Eclipse или любой другой IDE, которую вы используете. Задача Ant ‹script› - это полумера, подчеркивающая неадекватность xml для сборок. Зачем добавлять сценарии вместо того, чтобы просто полностью заменять неадекватный подход? - person Dean Schulze; 10.06.2009
comment
Обычно сценарий сборки должен запускаться на машине сборки, а не в вашей среде IDE. Если вы хотите использовать другой подход, выберите динамический язык. Скомпилированный язык не является подходящей платформой для сборки, IMO. - person Yishai; 10.06.2009
comment
Как указывал скаффман выше, я все еще могу использовать простой файл build.xml для управления выполнением Build.java, чтобы не было зависимости от IDE. Мой комментарий по поводу IDE был для типичного использования цикла разработки. Несколько точек запуска можно обрабатывать с помощью более простого build.xml, который контролирует Build.java. Я не понимаю, почему с помощью xml проще контролировать зависимости, чем с помощью Java. И Java, и xml вызывают основные задачи Ant. - person Dean Schulze; 10.06.2009

Здесь, кажется, потерялся важный момент.

Ant написан на Java, и я ищу лучший способ использовать задачи Ant (API в библиотеках Ant), чем через xml. На всю жизнь я не понимаю, как использование xml для вызова Java когда-либо было бы лучше или проще, чем использование Java для вызова Java.

Единственным препятствием является то, что подход xml документирован, тогда как подход Java не документирован, поэтому мне придется загрузить и ознакомиться с кодом Ant.

Я воздерживался от публикации этого вопроса в течение нескольких недель, потому что был уверен, что кто-то делал это раньше и что мой google-foo просто нуждается в улучшении. Использование Java для вызова API-интерфейсов Ant вместо xml кажется настолько очевидным, что я все еще удивлен, что для Ant не было разработано параллельного подхода на основе Java, а также подхода xml.

Однако то, что это очевидно, не означает, что кто-то делал это раньше.

person Dean Schulze    schedule 10.06.2009

Хотя я полагаю, что это возможно, вам, вероятно, было бы лучше использовать сценарии оболочки, чем писать полную программу на Java, чтобы просто автоматизировать сборки.

Вы бы упустили одно из ключевых применений ant, а именно простые для задания наборы файлов и легкие для чтения в свойствах.

Я застрял на ant, поскольку Groovy слишком близок к написанию всего приложения, чтобы просто создать ваше настоящее приложение. Слишком сложно для неприятностей.

person Mike Miller    schedule 09.06.2009
comment
Иногда файлы Ant build.xml становятся самостоятельными подпроектами. Сборки могут быть сложными, слишком сложными для xml. - person Dean Schulze; 10.06.2009

Хотя использовать задачи Ant внутри программ Java довольно просто, на вашем месте я бы, вероятно, придерживался файлов сборки Ant. Если вы занимаетесь отличной разработкой, если Eclipse не делает то, что вам нужно, возможно, вам нужно поискать в другом месте (IntelliJ, NetBeans и т. Д.).

person Community    schedule 09.06.2009