2014-05-09 7 views
3

J'essaie de créer une application über jar, mais en cours d'exécution dans un problème en raison d'une dépendance sur le cadre de printemps. En particulier, les espaces de noms pour les schémas XML sont problématiques. Vous obtenez le problème de NamespaceHandler infâme:créer un pot uber avec des dépendances à ressort

Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/c] 

Pour créer des pots uber (simples), Creating a bundle jar with ant, mais cela ne fonctionne pas si vous avez des dépendances de printemps en raison du fait que les pots de printemps ont des fichiers tels que spring.handlers , spring.schemas et spring.tooling dans les répertoires META-INF de plusieurs de leurs fichiers jar. La résolution de l'espace de noms dépend, je crois, de ces fichiers. Le über jar semble contenir tous les fichiers nécessaires, mais je suppose que le runtime en voit un seul.

Par exemple, un pot de mes tf pot uber montre (en partie)

META-INF/spring.handlers 
META-INF/spring.schemas 
META-INF/spring.tooling 
META-INF/license.txt 
META-INF/notice.txt 
META-INF/spring.factories 
META-INF/spring.handlers 
META-INF/spring.schemas 
META-INF/spring.tooling 
META-INF/license.txt 
META-INF/notice.txt 
META-INF/license.txt 
META-INF/notice.txt 
META-INF/spring.handlers 
META-INF/spring.schemas 
META-INF/spring.tooling 
META-INF/license.txt 
META-INF/notice.txt 
META-INF/license.txt 

donc: question .. est-il un moyen de créer un uber-pot qui a les pots de printemps enroulé à l'intérieur? Dois-je fusionner les fichiers META-INF? Quelqu'un a-t-il l'expérience de la fusion de fichiers avec des constructions de fourmis?

+1

Voici [un autre moyen] (http://stackoverflow.com/a/24083318/2208271) pour le faire. – Sithsu

Répondre

5

Eh bien ... c'était une douleur.

<target name="make-bundle" depends="jar"> 
    <!-- retrieve the dependencies --> 
    <ivy:retrieve conf="deploy" pattern="${dist.dir}/dependencies/[artifact].[ext]"/> 

    <delete dir="${dist.dir}/dependencies/uber" failonerror="false" /> 
    <mkdir dir="${dist.dir}/dependencies/uber"/> 
    <!-- iterate over the dependencies --> 
    <for param="file"> 
    <path> 
     <fileset dir="${dist.dir}/dependencies"> 
     <include name="**/*.jar"/> 
     </fileset> 
    </path> 
    <sequential> 
     <propertyregex override="yes" 
     property="jarname" input="@{file}" 
     regexp=".*/([^/]*)\.jar" replace="\1"/> 

     <!-- put the spring.* jars into special sub-directories --> 
     <mkdir dir="${dist.dir}/dependencies/${jarname}"/> 
     <unzip dest="${dist.dir}/dependencies/${jarname}" src="@{file}"> 
     <patternset> 
      <include name="**/META-INF/spring.*"/> 
     </patternset> 
     </unzip> 
     <!-- put everything else in the 'uber' directory --> 
     <unzip dest="${dist.dir}/dependencies/uber" src="@{file}"> 
     <patternset> 
      <exclude name="**/META-INF/spring.*"/> 
     </patternset> 
     </unzip> 
    </sequential> 
    </for> 

    <!-- build the concatenated spring.* files --> 
    <mkdir dir="${dist.dir}/dependencies/META-INF"/> 
    <concat destfile="${dist.dir}/dependencies/META-INF/spring.handlers" fixlastline="true"> 
    <fileset dir="${dist.dir}/dependencies/" includes="*/*/spring.handlers"/> 
    </concat> 
    <concat destfile="${dist.dir}/dependencies/META-INF/spring.schemas" fixlastline="true"> 
    <fileset dir="${dist.dir}/dependencies/" includes="*/*/spring.schemas"/> 
    </concat> 
    <concat destfile="${dist.dir}/dependencies/META-INF/spring.tooling" fixlastline="true"> 
    <fileset dir="${dist.dir}/dependencies/" includes="*/*/spring.tooling"/> 
    </concat> 
    <concat destfile="${dist.dir}/dependencies/META-INF/spring.factories" fixlastline="true"> 
    <fileset dir="${dist.dir}/dependencies/" includes="*/*/spring.factories"/> 
    </concat> 

    <!-- build the uber jar! --> 
    <delete file="${dist.dir}/myproject-with-dependencies.jar" failonerror="false"/> 
    <jar destfile="${dist.dir}/myproject-with-dependencies.jar"> 
    <!-- all dependency files except spring.* --> 
    <fileset dir="${dist.dir}/dependencies/uber"/> 
    <!-- the spring.* files --> 
    <fileset dir="${dist.dir}/dependencies/" includes="META-INF/*"/> 
    <!-- my project's classes & etc --> 
    <zipgroupfileset dir="${dist.dir}" includes="myproject.jar" /> 
    <manifest> 
     <attribute name="Main-Class" value="${main.class}"/> 
    </manifest> 
    </jar> 
</target> 
+2

Vous m'avez sauvé au moins une journée de travail avec cela. Je vous remercie! – Spina

+0

Où dois-je ajouter ces définitions? –

+0

Votre fichier ant build.xml. – ticktock

Questions connexes