2009-10-16 18 views
9

(Cfr modifiche di seguito.)Maven Antrun e dipendenze

La ragione per cui non posso utilizzare il percorso di classe, è perché ho bisogno di gestire alcune librerie non-Java, e sto compilando un non- progetto java.

Sto cercando di utilizzare le dipendenze Maven in una chiamata antrun, a seguito della documentazione sul sito Maven:

http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html

Nella parte inferiore della pagina:

<property name="mvn.dependency.jar" 
     refid="maven.dependency.my.group.id:my.artifact.id:classifier:jar.path"/> 
<echo message="My Dependency JAR-Path: ${mvn.dependency.jar}"/> 

posso fare questo lavoro, non importa come ci provo Ho provato $ {} attorno al contenuto refid, ho provato i due punti, i periodi, ecc. Come separatori in ogni modo a cui riesco a pensare.

Qualcuno può dirmi che cosa dovrebbe fare il ref come una dipendenza comune?

EDIT:

Grazie per la risposta.

Usando il tuo esempio SingleShot, ho il seguente:

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>create-messages</id> 
     <phase>compile</phase> 
     <configuration> 
      <tasks> 
      <property name="build.compiler" value="extJavac"/> 
      <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="log4j.jar" refid="log4j:log4j:jar"/> 
      <echo message="Where is the Log4J JAR?: ${log4j.jar}"/> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.14</version> 
     </dependency> 
    </dependencies> 
    </plugin> 

Ed ecco quello che ottengo quando eseguire compilazione mvn:

[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Chat Component 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.pom 
2K downloaded 
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.jar 
358K downloaded 
[INFO] [antrun:run {execution: create-messages}] 
[INFO] Executing tasks 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error executing ant tasks 

Embedded error: Reference log4j:log4j:jar not found. 
[INFO] ------------------------------------------------------------------------ 
[INFO] For more information, run Maven with the -e switch 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3 seconds 
[INFO] Finished at: Fri Oct 16 14:54:19 PDT 2009 
[INFO] Final Memory: 7M/80M 
[INFO] ------------------------------------------------------------------------ 

EDIT (2):

Guardando al codice sorgente collegato ho deciso di eseguire "mvn -X compile" e grep per "Storing", che genera un mucchio di output di log in cui le cose stanno andando g memorizzato.

Di interesse sono i fatti che la dipendenza sto esplicitamente specificando non sta mostrando nella lista, e, che quando passo a un tasto sulla base di una delle voci che faccio vedere, ho ancora ottenere il errore.

risposta

9

In base al codice a cui SingleShot si collegava, e casuale a poking fino a quando non funzionava, ecco come ho ottenuto questo problema "funzionante" (lo dico tra virgolette perché sembra molto tenue.)

Ecco il modo per farlo correttamente funzionare:

<property name="log4j_location" 
       value="${maven.dependency.log4j.log4j.jar.path}"/> 
<echo message="${log4j_location}"/> 

Alcune cose importanti da notare: è non è possibile utilizzare la dipendenza Maven come refid nell'impostazione della proprietà formica. Devi usare $ {} per ottenere il valore var di maven.

Sembra che la dipendenza sia presente nell'elenco delle dipendenze di primo livello, facendo sì che log4j una dipendenza del plug-in antrun non lo esponga al plugin in alcun modo che io possa vedere.

Tutti i separatori di percorso sono punti (.), Senza punti (:) che è il motivo per cui alla fine ho controllato la mia risposta come corretta.

Soapbox:

Consiglio vivamente a chiunque considerando Maven usare Ant con plugin Maven o, meglio ancora, usare Ant con Ivy invece.

Questo particolare problema è un esempio brillante del livello di difficoltà completamente assurdo associato a fare qualcosa fuori norma con Maven.

Dico questo avendo implementato un intero sistema di build basato su Maven2 e avendo anche implementato diversi sistemi di build in Ant. Ho usato sia Maven2 che Ant con build complessi che coinvolgono Java, Flex/AS3, C# e C++. Maven ha senso per Java progetti che hanno no dipendenze esterne su progetti in altre lingue.

Maven fa riferimento ad alcune cose che non sono affrontate implicitamente da Ant, ma con una pianificazione anticipata, Ant è lo strumento molto più flessibile, meglio documentato e meno complicato.

Se si decide di percorrere la route della form, assicurarsi di definire una struttura per i progetti, individuare il sistema di dipendenza (Utilizzare uno).

Penso che alla fine sarai molto più felice che con Maven, dato che non trascorrerai il tempo necessario a correggere il tuo sistema di costruzione.

2

Senza un esempio di ciò che hai digitato nel tuo POM è difficile dirlo, ma considera un esempio concreto. Diciamo che i tuoi riferimenti POM sono log4j (groupId = log4j, artifactId = log4j). Credo che questo sia come si dovrebbe fare riferimento che JAR nel file Ant:

<property name="log4j.jar" refid="maven.dependency.log4j:log4j:jar.path"/> 
<echo message="Where is the Log4J JAR?: ${log4j.jar}"/> 

Idealmente, non si dovrebbe avere per riferimento JAR specifici, ma piuttosto, fare riferimento l'intero percorso di classe per l'ambito appropriato, come la documentazione di un po 'scarne per il plug-in indica.

In caso di problemi, si prega di inviare il tag <dependency> per una dipendenza Maven POM che si sta utilizzando e posso provare ad essere più specifico.

Ho controllato lo plugin's code per confermare.

+0

Siamo spiacenti. La mia risposta originale ha mancato la "maven.dependency". prefisso e suffisso ".path". Ora è risolto e dovrebbe funzionare. Guarda la riga 87 della fonte del plug-in (linkato sopra) per vedere come dovrebbe apparire. – SingleShot

4

Come addendum alla risposta di Aaron H. sopra, ho dovuto impostare la versione del plug-in su 1.3 affinché funzionasse effettivamente. Lo stavo usando senza una versione specifica e ottenevo 1.1 (dove nulla sembra funzionare).


     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.3</version> 
     ... 
     </plugin> 
+1

Sospetto che la differenza sia in quale repository utilizziamo. Questo è, imho (o forse non così umile), solo un altro esempio di dove "funziona e basta" si rompe con Maven ... –

1

C'è un bug in the documentation.Il percorso dovrebbe essere di forma:

<property name="mvn.dependency.jar" 
    value="${maven.dependency.my.group.id.my.artifact.id.classifier.jar.path}"/> 

Quindi la chiave corretta per il vostro dipendenza log4j sarebbe:

maven.dependency.log4j.log4j.jar.path 

Si noti inoltre che dovrebbe essere value= piuttosto che refid=, quindi la proprietà completa sarebbe :

<property name="log4j.jar" 
     value="${maven.dependency.log4j.log4j.jar.path}"/> 
<echo message="My Dependency JAR-Path: ${log4j.jar}"/> 
0

Ho una formica esistente e abbiamo pianificato di utilizzare (nuovo) Maven per chiamarla. Ho riscontrato problemi che potrei non ricordare chiaramente, ma è legato ai percorsi di classe, forse proprio come i tuoi.

Il problema è che la "formica" che usiamo quotidianamente è uno script di shell che imposta i percorsi di classe, sia su XNIX che su Windows. Non ho confrontato i percorsi di classe impostati da esso e quelli disponibili per l'analisi, ma il mio test ha mostrato che non corrispondono e la formica non verrà eseguita con alcuni percorsi passati da Maven.

Quello che sto usando è "exec-maven-plugin" ed esegui ant come un programma esterno con alcuni argomenti applicati. Questo sicuramente funzionerà, ma aggiunge delle dipendenze extra.

2

Questo funziona per me.

<copy file="${javax.mail:javax.mail-api:jar}" todir="tomcat/lib" /> 
<copy file="${org.springframework:spring-instrument-tomcat:jar}" todir="tomcat/lib" /> 
<copy file="${postgresql:postgresql:jar}" todir="tomcat/lib"/> 

http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html ha la spiegazione di come fare riferimento dipendenze formano il percorso di classe formica.

Problemi correlati