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!

Author: IAmYourFaja, 2012-09-12

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.

Skąd pochodzi moja konfiguracja? Definiuję to w moim 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:

  1. jak użyj <taskdef> w swoim build.xml, aby włączyć zadania Ivy Ant do swojego budowania.
  2. jak użyć zadania Ivy Ant <ivy:settings> aby skonfigurować Ivy.
  3. jak używać <ivy:resolve/> do odczytu w pliku ivy.xml i rozwiązywania zależności jar innych firm.
Prawdopodobnie chcesz użyć tych plików jar. Można to zrobić na trzy sposoby:]}
 <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.

Czasami musisz włożyć słoiki do swojego projektu. Na przykład, jeśli utworzysz plik war lub ear, chcesz dołączyć swoje Jary. W takim przypadku możesz użyć tego:
<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.

 56
Author: David W.,
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":

 12
Author: Mark O'Connor,
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