Perché i vasetti vengono esclusi dalla distribuzione di Enunciate?
Domanda
Sto usando Enunciate per costruire un prototipo di API REST e devo includere un vaso contenente codice personalizzato come una biblioteca.
My Ant Script è simile al seguente:
<!--include all jars-->
<path id="en.classpath">
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</path>
<!--define the task-->
<taskdef name="enunciate" classname="org.codehaus.enunciate.main.EnunciateTask">
<classpath refid="en.classpath" />
</taskdef>
<mkdir dir="${dist}" />
<enunciate dir="${src}" configFile="${basedir}/enunciate.xml">
<include name="**/*.java" />
<classpath refid="en.classpath"/>
<export artifactId="spring.war.file" destination="${dist}/${war.name}" />
</enunciate>
Il problema è che il mio barattolo personalizzato viene escluso dal file WAR. È necessario compilare le classi annotate enunciate in modo che il vaso sia ovviamente sul percorso di classe al momento della compilazione ma enunciate non riesce a includerlo nella distribuzione. Ho anche notato che molti dei barattoli necessari per enunciate non vengono inclusi nel file WAR.
Perché vengono esclusi e come posso risolverli?
Soluzione 2
Come risulta che uno dei barattoli che stiamo tentando di includere ha una dipendenza elencata nel suo file manifest di un vaso da cui Enunciate dipende (freemarker). Enunciate esclude automaticamente il freemarker e a prima vista sembra escludere automaticamente tutto ciò che dipende anche dal freemarker. Se rimuoviamo il freemarker dall'elenco dei barattoli dipendenti nel file manifest del nostro codice, funziona perfettamente.
Tuttavia; Ho parlato con lo sviluppatore principale di Enunciate (Ryan Heaten) e mi assicura che non è quello che sta succedendo. Inclusa la sua risposta di seguito:
Davvero?!
Wow. Interessante. Non so spiegare essa; Enunciate non guarda a cosa nel Manifest per determinare cosa includere in guerra, quindi lo sono un po 'perplesso qui. Potrebbe anche essere un comportamento strano della formica (no incluso quel barattolo nel & Quot; en.classpath " riferimento per alcuni ragione).
~ Ryan
Altri suggerimenti
Non ho mai usato enunciate, ma come hack rapido puoi aggiungere i vasetti alla guerra:
<jar jarfile="${dist}/${war.name}" update="true">
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</jar>
Nota: probabilmente si desidera aggiungere i vasetti nella directory WEB-INF / lib , anziché nella directory principale.
Suppongo che enunciate faccia il mininum per interferire con il tuo processo di compilazione, dato che sai meglio cosa mettere nel tuo file jar.
In enunciate.xml gli dico di non copiare alcuna libreria:
<webapp doLibCopy="false">
Quindi nel file build ant alla fine del compito enunciato aggiorno la guerra (puoi farlo per aggiornare i vasetti inclusi / esclusi indipendentemente dal fatto che tu abbia enunciato copiare i vasetti per te nel passaggio sopra):
<war destfile="build-output/{mywar}" update="true">
<lib dir="WebContent/WEB-INF/lib">
<include name="**/*.jar" />
</lib>
<lib dir="build-output">
<include name="some_other.jar" />
</lib>
</war>