Дано
Jar-файл, собранный с зависимыми библиотеками прямо внутри (это когда просят сделать весь проект в одном файле, и тогда сторонние библиотеки разжимаются и копируются в целевой jar в виде классов);
Конфигурация spring в xml-файлах, также внутри jar-а
Внешний проект запускает метод, в котором создаётся ApplicationContext spring-а.
Для сборки используется ant
Проблема
При попытке загрузить конфиг во внешнем проекта получаеv ошибку при создании ApplicationContext : "Unable to locate Spring NamespaceHandler for XML schema namespace"
Что дали поиски проблемы
В двух словах, при сборке нескольких spring-библиотек в один файл, перекрываются схемы и другие настройки, которые хранятся в META-INF/spring.* файлах, которые для каждой библиотеки спринга свои. Т.е. остаются в итоге те, что собирались последними - они просто накрывают предыдущие.
Источники
http://stackoverflow.com/questions/8523997/unable-to-locate-spring-namespacehandler-for-xml-schema-namespace-http-www-sp/8574629#8574629
http://stackoverflow.com/questions/23574979/creating-an-uber-jar-with-spring-dependencies (это уже почти решение)
Решение (быстрое)
По мотивам описанного на stackoverflow был сделан отдельный ant-скрипт, который создаёт общие META-INF/spring.* схемы и настройки. Затем эти файлы были добавлены в папку с META-INF, которая подкладывается в финальный jar при сборке.
А в процессе сборки jar-а, исключаются те spring-настройки, которые разжимаются из spring-библиотек.
Скрипт ant, который собирает из отдельных spring-настроек, всё в общие настройки для всех библиотек spring-а, которые используются в проекте.
<?xml version="1.0" encoding="UTF-8"?>
<project name="springschemamake" default="create.spring.schema.full">
<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="lib/ant-contrib-1.0b3.jar"/>
<property name="lib.dir" value="${basedir}/lib"/>
<property name="dist.dir" value="${basedir}/templib"/>
<target name="create.spring.schema.full">
<!-- iterate over the dependencies -->
<for param="file">
<path>
<fileset dir="${lib.dir}">
<include name="**/*spring*.jar"/>
</fileset>
</path>
<sequential>
<local name="jar.name"/>
<basename property="jar.name" file="@{file}"/>
<!-- put the spring.* jars into special sub-directories -->
<mkdir dir="${dist.dir}/${jar.name}"/>
<unzip dest="${dist.dir}/${jar.name}" src="@{file}">
<patternset>
<include name="**/META-INF/spring.*"/>
</patternset>
</unzip>
</sequential>
</for>
<mkdir dir="${dist.dir}/META-INF"/>
<!-- build the concatenated spring.* files -->
<mkdir dir="${dist.dir}/META-INF"/>
<concat destfile="${dist.dir}/META-INF/spring.handlers" fixlastline="true">
<fileset dir="${dist.dir}/" includes="*/*/spring.handlers"/>
</concat>
<concat destfile="${dist.dir}/META-INF/spring.schemas" fixlastline="true">
<fileset dir="${dist.dir}/" includes="*/*/spring.schemas"/>
</concat>
<concat destfile="${dist.dir}/META-INF/spring.tooling" fixlastline="true">
<fileset dir="${dist.dir}/" includes="*/*/spring.tooling"/>
</concat>
<concat destfile="${dist.dir}/META-INF/spring.factories" fixlastline="true">
<fileset dir="${dist.dir}/" includes="*/*/spring.factories"/>
</concat>
<delete includeemptydirs="true">
<fileset dir="${dist.dir}" includes = "**/*spring*/**" excludes="/META-INF/**"/>
</delete>
</target>
</project>
Решение правильное, но пока не сделанное
Включить сборку схем spring-а в общий ant-скрипт. Он и до такого включения был довольно большой, поэтому потребуется некоторое время на рефакторинг и реализацию.