Проблемы с получением моих сборок ANT после обновления ОС
Недавно я обновил свою систему с Mint12 до Mint14, и у меня были серьезные проблемы с тем, чтобы мои старые проекты хорошо работали на новой системе. Подводя итог всего этого:
- Получил Mint14, чтобы работать хорошо и установил все мое необходимое программное обеспечение (Eclipse, ANT и т. Д.)
- Восстановил мои файлы с моего резервного диска
- Установите Oracle JDK в качестве версии Java по умолчанию
- Проверил свежую копию моего проекта из SVN
- Обновлены все пути в файле сборки, чтобы отразить новый user_id
Это все хорошо, но моя сборка муравья, кажется, как-то испортилась, так что, когда я пытаюсь построить свой проект, я получаю следующую ошибку:
~/new_workspace/my_project $ ant dist
Buildfile: /home/my_userid/new_workspace/my_project/build.xml
[taskdef] Could not load definitions from resource net/sf/antcontrib/antlib.xml. It could not be found.
init:
compile:
[javac] /home/my_userid/new_workspace/my_project/build.xml:246: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
static:
dist:
[svn] <Status> started ...
[svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
[svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
[svn] <Status> failed !
BUILD FAILED
/home/my_userid/new_workspace/my_project/build.xml:104: Can't get status of /home/my_userid/new_workspace/my_project
Total time: 0 seconds
Я обратил внимание на "слишком старый, чтобы работать с рабочей копией...", но когда я проверяю svn --version
Я вижу, что это 1.7.5, который должен быть в порядке. Обратите внимание, что версия SVN на сервере не изменилась. Теория состоит в том, что проект (проверенный через Eclipse, использующий Subclipse 1.6) не работает с версией, которую ANT использует через командную строку, но в этом случае версия клиента не слишком старая, а скорее слишком новая!? Будет ли стоить "понижение" Subversion?
Иначе в чем может быть проблема и как я могу ее решить? Существуют ли другие общие проблемы (которые могут возникнуть во время обновления / миграции дистрибутива), которые я должен проверить, чтобы убедиться, что проект работает должным образом? (Ниже приведены соответствующие биты файла сборки)
Этот бит определяет привязки SVN
<path id="svnant.classpath">
<fileset dir="/home/my_userid/.ant/lib">
<include name="svnant.jar" />
<include name="svnClientAdapter.jar" />
<include name="svnjavahl.jar" />
<!-- <include name="svnkit.jar" /> tried this as well but no joy -->
</fileset>
</path>
Соответствующий бит в цели "dist":
<target name="dist"
depends="compile,static" description="Compiles and builds jar files">
<mkdir dir="${dist}"/>
<buildnumber file="project-version.properties"/>
<property name="version.number" value="${major.version}.${minor.version}.${micro.version}"/>
<svn>
<status path="."
lastChangedRevisionProperty="rev.number" />
<info target="." />
</svn>
...
2 ответа
Я вижу первую проблему:
[taskdef] Could not load definitions from resource net/sf/antcontrib/antlib.xml. It could not be found.
Это говорит мне, что у вас есть <taskdef>
Задача где-то в вашем build.xml
файл, и что он больше не может найти отсутствующий необязательный Ant jar.
Моя теория: в вашей старой версии Ant под $ANT_HOME/lib
Вы установили банку Ant-Contrib. Так как этот каталог находится в Ant $CLASSPATH
по умолчанию вам не нужно было указывать это в своем <taskdef>
строка задач, так это выглядит так:
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
Я всегда рекомендую вам всегда добавлять эти дополнительные банки задач в ваш проект. Таким образом, никто не должен устанавливать эти фляги, чтобы они работали, так как они уже в проекте:
- Сделать каталог
/home/my_userid/new_workspace/my_project/antlib/ac
, так что ваш проект будет иметь каталогantlib/ac
в этом. - В этом каталоге скачайте и установите ant-contrib-1.03.jar
- Теперь поменяй
<taskdef>
включить эту банку в свой путь к классам.
Это должно выглядеть так:
<property name="antlib.dir" value="${basedir}/antlib"/>
<property name="ant-contrib.lib" value="${antlib.dir}/ac"/>
<taskdef resource="/net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="${ant-contrib.lib/>
</classpath>
</taskdef>
добавлять antlib/ac/ant-contrib-1.03b.jar
на ваш проект. Таким образом, если кто-то проверяет ваш проект, он собирается, даже если он не загружал и не устанавливал jar ant-contrib на свой компьютер.
Обратите внимание, я использую ant.xml
и не antcontrib.properties
, Это дает мне доступ к <for/>
задание вместо старшего <foreach>
задача. Все это объясняется на этой странице установки Ant-Contrib.
Теперь другая ошибка:
dist:
[svn] <Status> started ...
[svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
[svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
[svn] <Status> failed !
Во-первых, реальная проблема заключается в том, что ваша клиентская версия Subversion на самом деле слишком новая и не слишком старая. Subversion внутри Ant использует svnjavahl.jar
клиент, который, вероятно, хочет старую версию Subversion 1.6. Между тем, версия клиента Subvfersion, которую вы извлекли, использует более новую версию 1.7. Eclipse может выполнять извлечения Subversion, устанавливая JavaHL, SVNKit или даже используя клиент командной строки.
Взгляните на структуру каталогов вашего извлеченного каталога и посмотрите, не являются ли они печально известными .svn
каталоги разбросаны в каждом каталоге или просто в корневом каталоге. Если .svn
Этот каталог находится только в корневом каталоге вашего рабочего каталога, у вас есть версия Subversion для версии 1.7.x, выполняющая извлечение, и ваш jar-файл Subversion, который использует Ant, хочет использовать более старую версию рабочего каталога от 1.2 до 1.6.x. Если вы видите те, .svn
каталоги разбросаны по всему вашему рабочему каталогу, тогда ваша первоначальная проверка использует старую версию рабочего каталога, а Ant использует новую версию.
Итак, вот решение в любом случае: удалите весь коммит Subversion из вашего build.xml
файл Прежде всего, это файл сборки, и он не должен вносить никаких изменений в вашу систему контроля версий. Это плохая форма. Изменения следует вносить только тогда, когда пользователь этого хочет, а не потому, что он бездумно выполнил файл build.xml.
Во-вторых, вы не должны хранить производные результаты сборки в своем хранилище. Храните только источник, а не то, что получено. Вместо этого используйте систему сборки, такую как Jenkins, для управления всем бизнесом по сборке и распространению.
Сохранение дистрибутивов в системе контроля версий не приносит вам никакой пользы. Вы не можете посмотреть историю распространения и понять, какие изменения были внесены. Вы не можете сделать различие между двумя версиями дистрибутива и увидеть изменения. Лучшее, что вы можете сказать, это то, что это удобное место для его поиска. Проблема заключается в том, что дистрибутивы занимают много места каждый раз, когда вы создаете новую версию, и через некоторое время большинство из них перестают работать. В Subversion нет простого способа удалить их, поэтому они просто начинают занимать кучу места.
Допустим, у вас есть скромное распределение 100 Мб, которое вы храните для своих ежедневных сборок. Предположим, 200 сборок в год (без сборок в выходные или праздничные дни), и вы добавляете 2 ГБ места в хранилище в год.
С Jenkins вы можете хранить свои дистрибутивы внутри сборок Jenkins, и Jenkins автоматически удалит даже более старые неважные дистрибутивы. Распределение теперь связано со сборкой, которая его использовала, и вы можете увидеть различия между сборками.
Но что, если эти дистрибутивы являются файлами jar, которые нужны другим проектам? Используйте систему управления зависимостями, такую как Ivy, и локальный репозиторий Maven, такой как Nexus или Artifactory, для управления ею.
Даже если вы не хотите заходить так далеко, вы все равно можете достать необходимые банки, используя <get/>
задание прямо от Дженкинса. Jenkins предоставляет вам последнюю хорошую ссылку на артефакт, и это может быть использовано в вашей системе сборки, чтобы вытащить нужные банки.
Надеюсь это поможет.
Дэвид упомянул об использовании ivy для управления сторонними зависимостями.
Этот пример демонстрирует, как зависимости ant-contrib и subversion могут загружаться и кэшироваться сборкой.
В вопросе о подрывной деятельности я всегда находил проблематичным включение в ANT. То, что я желал, был чистый подход Java, был бы более надежным и кроссплатформенным. Мое решение было svnkit, а затем создать макрос для вызова клиента командной строки.
пример
Демонстрирует использование ivy для управляемых зависимостей subversion и ant-contrib. Зависимости объявляются in-line, используя задачу cachepath. Используйте отдельный файл ivy.xml, если вы управляете несколькими путями классов
Apache Ant(TM) version 1.8.2
Apache Ivy 2.3.0-rc2
build.xml
<project name="build"
default="demo-ant-contrib"
xmlns:ivy="antlib:org.apache.ivy.ant"
xmlns:ac="antlib:net.sf.antcontrib">
<!--
======
Macros
======
-->
<macrodef name="svn-checkout">
<attribute name="src"/>
<attribute name="dest"/>
<sequential>
<mkdir dir="@{dest}"/>
<java classname="org.tmatesoft.svn.cli.SVN" dir="@{dest}" fork="true" classpathref="build.path">
<arg value="--non-interactive"/>
<arg line="--username ${svn.user}"/>
<arg line="--password ${svn.pass}"/>
<arg value="checkout"/>
<arg value="@{src}"/>
</java>
</sequential>
</macrodef>
<!--
=======
Targets
=======
-->
<target name="resolve" description="Resolve 3rd party dependencies">
<ivy:cachepath pathid="build.path">
<dependency org="org.tmatesoft.svnkit" name="svnkit-cli" rev="1.7.8" conf="default"/>
<dependency org="ant-contrib" name="ant-contrib" rev="1.0b3" conf="default"/>
<exclude org="ant"/>
</ivy:cachepath>
</target>
<target name="checkout" depends="resolve" description="Pull code from SCM repository">
<svn-checkout src="http://svn.apache.org/repos/asf/subversion/trunk" dest="build/subversion"/>
</target>
<target name="demo-ant-contrib" depends="resolve" description="Demonstrate using ant-contrib">
<taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml" classpathref="build.path"/>
<ac:for list="a,b,c,d,e" param="letter">
<sequential>
<echo>Letter @{letter}</echo>
</sequential>
</ac:for>
</target>
<target name="clean" description="Cleanup build files">
<delete dir="build"/>
</target>
<target name="clean-all" depends="clean" description="Cleanup and purge ivy cache">
<ivy:cleancache/>
</target>
</project>