Jak skonfigurować Ivy dla Ant build
Obecnie mam ANT_HOME
znajduje się w /home/<myuser>/ant/1.8.4/ant-1.8.4
.
Właśnie ściągnąłem Apache Ivy tarball, który zawiera jego zależności. Wyciągnąłem go do /home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1
.
Skopiowałem /home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1/lib/*.jar
do ANT_HOME/lib
. Jeśli moje zrozumienie, jak działa Ant z wtyczkami/rozszerzeniami jest poprawne, Ant powinien teraz mieć dostęp do wszystkich zadań Ivy w czasie wykonywania.
Moje następne pytanie brzmi, jak zdefiniować zadania Ivy wewnątrz mojego Ant buildfile? Say I want to use ivy-retrieve
, ivy-resolve
i ivy-publish
zadania. What are all konfiguracje, które muszę zrobić (w XML), aby te zadania działały, gdy uruchamiam mój Ant build z wiersza poleceń(Nie będę budował przez wtyczkę Ant-Eclipse). Z góry dzięki!
2 answers
Najpierw musisz zdefiniować <taskdef>
, aby wskazać zadania Ivy.
<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>
<taskdef resource="org/apache/ivy/ant/antlib.xml">
<classpath>
<fileset dir="${ivy.home}">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
To da ci dostęp do zadań Ivy. Możesz użyć tych zadań w ten sposób:
<cachepath pathid="main.classpath" conf="compile"/>
Problem polega na tym, że nazwy Twoich zadań Ivy mogą kolidować z innymi zadaniami mrówek. Na przykład, istnieje zadanie Ivy <report>
. Aby to rozwiązać, możesz utworzyć przestrzeń nazw Ivy. Aby to zrobić, możesz umieścić odniesienie w swojej przestrzeni nazw w encji <project>
w taki sposób:
<project name="my.proj" default="package" basedir="."
xmlns:ivy="antlib:org.apache.ivy.ant"/>
Teraz, kiedy zdefiniujesz zadania Ivy, możesz użyj tego antlib:org.apache.ivy.ant
odniesienia do swojej przestrzeni nazw ivy
. Taskdef jak poprzednio, ale z polem uri
:
<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant">
<classpath>
<fileset dir="${ivy.home}">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
Przy okazji, nie ma w tym nic specjalnego. Mogłem to zrobić:
<project name="my.proj" default="package" basename="."
xmlns:ivy="pastrami:with.mustard">
[...]
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="pastrami:with.mustard">
<classpath>
<fileset dir="${ivy.home}">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
Chodzi o to, że teraz możesz dodawać nazwy zadań przedrostkiem ivy:
. Zamiast tego:
<cachepath pathid="main.classpath" conf="compile"/>
Możesz teraz zrobić to:
<ivy:cachepath pathid="main.classpath" conf="compile"/>
W ten sposób zyskujesz dostęp do swoich zadań Ivy Ant.
Teraz, masz dostęp do swoich zadań Ivy Ant, musisz zdefiniować ivysettings.xml
plik i użyj zadania <ivy:settings/>
, aby tam wskazać:
<ivy:settings file="${ivy.home}/ivysettings.xml"/>
Istnieje domyślny plik ivysettings.xml
osadzony w Ivy, który wskaże Ci System repozytorium Maven. Jeśli nie masz firmowego repozytorium Maven, możesz użyć domyślnego pliku ivysettings.xml
:
<ivy:settings/>
To dość proste.
Gdy już to zrobisz, musisz wczytać i rozwiązać Twój plik ivy.xml
, który zwykle znajduje się w katalogu głównym Twojego projektu w tym samym katalogu co twój build.xml
plik.
Zasadniczo plik ivy.xml
zawiera odniesienia do słoików stron trzecich, które chcesz wnieść do projektu. Na przykład:
<dependencies>
<dependency org="log4j" name="log4j" rev="1.2.17" conf="compile->default"/>
<dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
</dependencies>
Chodzi o to, że potrzebuję log4j.jar
(revision 1.2.17) do kompilacji (i do kompilowania testów też) i potrzebuję junit.jar
(revision.4.10) do kompilacji mojego kodu testowego.
compile->default
jest mapowaniem mojej konfiguracji compile
do konfiguracji Mavena default
(która mówi, że chcę tylko Jar i wszelkie inne Jary, które mogą zależy od tego.
ivy.xml
. Istnieje dziesięć standardowych konfiguracji. To również wchodzi do pliku ivy.xml
:
<configurations>
<conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/>
<conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/>
<conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/>
<conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/>
<conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/>
<conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/>
<conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/>
<conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/>
<conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/>
<conf name="optional" visibility="public" description="contains all optional dependencies"/>
</configurations>
Możesz użyć dowolnej nazwy konfiguracji, ale są one mapowane do domyślnych konfiguracji Mavena i są szeroko stosowane.
Po zdefiniowaniu pliku ivy.xml
możesz użyć <ivy.resolve>
do rozwiązania zależności:
<ivy:resolve/>
Mamy więc:
- jak użyj
<taskdef>
w swoimbuild.xml
, aby włączyć zadania Ivy Ant do swojego budowania. - jak użyć zadania Ivy Ant
<ivy:settings>
aby skonfigurować Ivy. - jak używać
<ivy:resolve/>
do odczytu w plikuivy.xml
i rozwiązywania zależności jar innych firm.
<ivy:cachepath pathid="main.classpath" conf="compile"/>
Zadanie <ivy:cachepath/>
utworzy classpath (w tym przypadku o nazwie main.classpath ), który wskazuje na słoiki, które mieć w konfiguracji ivy.xml
pliku compile
. Jest to używane przez większość czasu.
Jeśli potrzebujesz zestawu plików, możesz użyć tego:
<ivy:cachefileset setid="compile.fileset" conf="compile"/>
W tym przypadku utworzy zestaw plików z refid compile.fileset
.
<property name="lib.dir" value="${target.dir}/lib"/>
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]"
conf="runtime"/>
Które pobierze Twoje słoiki do katalogu ${lib.dir}
, dzięki czemu możesz je umieścić w wojny czy uszy.
Przepraszam za długą odpowiedź, ale jest wiele kroków do pokonania. Bardzo polecam książkę Manninga mrówka w akcji , która zawiera cały rozdział o Ivy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 10:29:13
David dał bardzo dobrą odpowiedź, ale chciałbym zaznaczyć, że taskdef nie jest wymagany. Pod warunkiem, że ivy.jar znajduje się w oczekiwanej lokalizacji deklaracja przestrzeni nazw na górze pliku ANT wystarczy:
<project ..... xmlns:ivy="antlib:org.apache.ivy.ant">
Aby uzyskać więcej szczegółów polecam przeczytać o tym, jak działa ANT libs.
Następująca odpowiedź zawiera więcej porad "zakładanie bluszczu":
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:32