2009-03-31 13 views
18

Esistono plug-in ant che avvolgono Maven in modo da poter utilizzare le sue funzionalità di gestione delle dipendenze per scaricare i file jar per me e inserirli nella cartella lib della mia build ant?Utilizzo di Maven da Ant

Il mio problema specifico è che sto utilizzando il plug-in Crap4j per Hudson, ma al momento non supporta Maven. Dato che si tratta di un piccolo progetto, Maven è eccessivo, ma non voglio andare senza mvn dependency:copy-dependcies se non devo.

Qualche suggerimento? (altro che succhiarlo)

risposta

11

Se pensi che Maven sia eccessivo nel tuo progetto, potresti/dovresti provare Apache Ivy: È una libreria di gestione delle dipendenze molto potente simile a quella di Maven.

Se stai ospitando un progetto sul web, dai uno sguardo allo Ivy Roundup, è un archivio di definizioni di Ivy per varie librerie.

+0

Dopo un po 'di configurazione vinto difficile, ho ottenuto questo correre come un fascino. Grazie mille. –

+0

@Vladimir bravo –

+9

come è anche vicino ad essere la risposta giusta? – robert

13

Esiste un nuovo set di attività Ant che utilizzano Mercury. Mercury è il codice refactored che sarà la base del modo in cui Maven 3 interagisce con i repository Maven (e OSGi) che vengono implementati da Oleg Gusakov. Mercury è ben testato e puoi iniziare a usarlo nei progetti Ant oggi. Date un'occhiata ad alcuni dei How-to documenti Oleg ha scritto:

http://people.apache.org/~ogusakov/sites/mercury-ant/mercury-ant-tasks/howto.html

Ecco un semplice esempio di utilizzo di Mercurio in un file build.xml Ant. Il seguente file generazione crea un percorso di classe che dipende verion 3.0 del manufatto asm:

<javac srcdir="src/main/java" 
     destdir="target/classes"> 
    <classpath> 
    <deps> 
     <dependency name="asm:asm:3.0"/> 
    </deps> 
    </classpath> 
</javac> 

Ci sono un sacco di funzioni avanzate come il supporto per la verifica delle firme PGP o digest MD5. Puoi anche iniziare a definire diversi repository da cui dipende Mercurio. Questo XML consente di definire un riferimento a un repository, come Nexus oltre a utilizzare una directory locale come un repository:

<repo id="myCentral" 
url="http://localhost:8081/nexus/contengs/groups/public"/> 
<repository dir="/my/local/repo"/> 

<javac srcdir="src/main/java" 
     destdir="target/classes"> 
    <classpath> 
    <deps> 
     <dependency name="asm:asm:3.0"/> 
    </deps> 
    </classpath> 
</javac> 

Se è necessario fare riferimento a un repository che richiede l'autenticazione Mercury ha il supporto per la memorizzazione di un nome utente e Password:

<repo id="myCentral" 
url="http://localhost:8081/nexus/contengs/groups/public"> 
    <auth name="foo" pass="bar"/> 
</repo> 

<javac srcdir="src/main/java" 
     destdir="target/classes"> 
    <classpath> 
    <deps> 
     <dependency name="asm:asm:3.0"/> 
    </deps> 
    </classpath> 
</javac> 

più convincente è la possibilità di pubblicare un manufatto in un repository da un file Ant. Se lavori in un'organizzazione di qualsiasi dimensione, ti consigliamo di iniziare a pensare alla distribuzione di risorse in un gestore di repository come Nexus. Con Mercury, è possibile iniziare a distribuire risorse su un gestore di repository senza dover adottare Maven. Ecco un file di configurazione che definisce un repository autenticato e scrive un artefatto:

<repo id="myCentral" 
url="http://localhost:8081/nexus/contengs/groups/public"> 
    <auth name="foo" pass="bar"/> 
</repo> 

<write repoid="myCentral" 
     name="t:t:1.0" 
     file="${basedir}/target/t.jar"/> 

Mercurio è pronto per l'uso, e ci si può aspettare un sacco di sviluppi da Oleg andare avanti. Se vuoi iniziare a usarlo, il posto migliore per guardare è Oleg's How-to Page. (Nota: queste informazioni saranno presto integrate nel Definitive Guide)

+2

Mercury Ant Tasks non è stato aggiornato da dicembre 2008 ... –

+1

Ad oggi non è ancora aggiornato e la versione è uno SNAPSHOT di un alfa 1. – Brice

+0

Questo va bene, ma non è possibile eseguire un'installazione mvn clean Non penso – Ring

11

Mentre le attività di mercurio funzionano, non le ho utilizzate. Ho avuto un buon successo con i loro predecessori, lo maven-ant-tasks. Sono abbastanza semplici da usare, se hai già un POM a portata di mano.

Mi piace mantenere i miei contenitori di formica all'interno del progetto, quindi ho aggiunto taskdef e percorso.Ma se si desidera inserire maven-ant-tasks-2.0.9.jar in ~/.ant/lib, non è necessario dichiarare questa roba. Credo.

+0

Hai ragione riguardo al posizionamento del file maven-ant-task.jar. Hai solo bisogno di quelle due linee se ce l'hai dentro il tuo progetto e non nella cartella lib della tua formica. Ecco come una volta ho risolto un problema, http://stackoverflow.com/a/32950670/1793718 – Lucky

5

Basta usare lo Maven Ant Tasks. Possono essere scaricati allo normal maven download page.

+5

+1 - è il 2012 e le attività di antispam sono il modo migliore che ho trovato per utilizzare la gestione delle dipendenze tramite form. Ho provato sul serio a usare l'edera qualche anno fa, ma alla fine ho rinunciato a questo e sono andato solo con i compiti di formica per i progetti ant-only, e, quando possibile, avanzavo. Ivy è stata (era) solo una reimplementazione dell'idea di base del maven senza alcun beneficio aggiuntivo, tranne un nome diverso (che era abbastanza per molti). Oggi, però, più progetti semplicemente (sì, semplicemente) usano Maven e ricorrono solo a formiche per casi angolari (imo). Se il codice sarà (ri) usato, mavenize il poroject appena possibile. – michael

0

Sto lavorando allo stesso problema in questo momento. Ho installato tutte le librerie necessarie nel mio repository Maven locale e da lì l'ho inserito nella nostra azienda Maven Repo. Non funziona ancora abbastanza bene. Alcuni test falliscono che funzionano bene durante il mio test di Maven, ma dal momento che l'esito del test non è importante per i dati di copertura, sono abbastanza soddisfatto.

Ecco il mio snippet Maven. Spero che aiuti.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.1</version> 
    <inherited>false</inherited> 
    <executions> 
     <execution> 
      <phase>site</phase> 
      <configuration> 
       <tasks> 
        <property name="compile_classpath" refid="maven.compile.classpath"/> 
        <property name="runtime_classpath" refid="maven.runtime.classpath"/> 
        <property name="test_classpath" refid="maven.test.classpath"/> 
        <property name="plugin_classpath" refid="maven.plugin.classpath"/> 
        <property name="CRAP4J_HOME" value="${user.home}/Projects/crap4j"/> 
        <taskdef name="crap4j" classname="org.crap4j.anttask.Crap4jAntTask"> 
         <classpath> 
          <fileset dir="${CRAP4J_HOME}/lib"> 
           <include name="**/*.jar"/> 
          </fileset> 
         </classpath> 
        </taskdef> 
        <crap4j projectdir="${project.basedir}/alm-jar-server" 
          outputDir="${project.basedir}/crap4jReports" 
          dontTest="false" 
          debug="true"> 
         <classes> 
          <pathElement location="${project.basedir}/target/classes"/> 
         </classes> 
         <srces> 
          <pathElement location="${project.basedir}/src/main/java"/> 
         </srces> 
         <testClasses> 
          <pathElement location="${project.basedir}/target/test-classes"/> 
         </testClasses> 
         <libClasspath> 
          <fileset dir="${user.home}/.m2/repository"> 
           <include name="**/*.jar"/> 
          </fileset> 
         </libClasspath> 
        </crap4j> 


        </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>org.crap4j</groupId> 
      <artifactId>crap4j</artifactId> 
      <version>1.1.6</version> 
     </dependency> 
     <dependency> 
      <groupId>org.kohsuke</groupId> 
      <artifactId>args4j</artifactId> 
      <version>2.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.agitar</groupId> 
      <artifactId>asmlib</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-httpclient</groupId> 
      <artifactId>commons-httpclient</artifactId> 
      <version>3.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.agitar</groupId> 
      <artifactId>coverage</artifactId> 
      <version>1.0</version> 
     </dependency> 
    </dependencies> 
</plugin> 
4

consultare questo: Why you should use the Maven Ant Tasks instead of Maven or Ivy

non consiglierei davvero Ivy per motivi indicati nel link qui sopra.

+1

Gli argomenti contro Ivy sono falsi. Se davvero vuoi usare Maven, allora sicuramente non usare Ivy. Dicendo che Maven è migliore di Ivy perché Ivy non è come Maven è interessante. Sono sicuro che nessuno lo compri. –

2

E 'molto semplice da eseguire Maven gol di Ant

<target name="buildProject" description="Builds the individual project"> 
    <exec dir="${source.dir}\${projectName}" executable="cmd"> 
     <arg value="/c"/> 
     <arg value="${env.MAVEN_HOME}\bin\mvn.bat"/> 
     <arg line="clean install" /> 
    </exec> 
</target> 

Usando questo si sta consentire di eseguire qualsiasi tipo di Maven gol di Ant ...

Godetevi ....

+0

Non è cross-platform e le attività di Maven Ant sono migliori per questo scopo. – gouessej

+0

@dhawal Ho provato questo, ma ottengo [exec] Il sistema non riesce a trovare il percorso specificato. [exec] Risultato: 1 – pankaj

2

Nel mio caso voglio solo un vaso EJB di essere al repository così ho potuto utilizzarlo su un altro progetto con Maven come dipendenza così:

<target name="runMaven" depends="deploy" description="LLama al maven."> 
    <exec executable="cmd"> 
     <arg value="/c"/> 
     <arg value="mvn.bat install:install-file -DgroupId=com.advance.fisa.prototipo.camel -DartifactId=batch-process -Dversion=1.0 -Dpackaging=jar -Dfile=${jarDirectory}\batch-process.jar"/> 
    </exec> 
</target> 
1

Scarica Maven Ant Tasks quindi utilizzare questo:

<target name="getDependencies"> 
     <path id="maven-ant-tasks.classpath" path="${basedir}${file.separator}maven${file.separator}lib${file.separator}maven-ant-tasks.jar" /> 
     <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="antlib:org.apache.maven.artifact.ant" classpathref="maven-ant-tasks.classpath" /> 

     <artifact:dependencies filesetId="dependency.fileset" type="jar"> 
      <pom file="pom.xml" /> 
     </artifact:dependencies> 

     <!--TODO take care of existing duplicates in the case of changed/upgraded dependencies--> 
     <copy todir="lib"> 
      <fileset refid="dependency.fileset" /> 
      <mapper type="flatten" from="${dependency.versions}" /> 
     </copy> 
    </target> 
Problemi correlati