Дано
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-а, которые используются в проекте.
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-скрипт. Он и до такого включения был довольно большой, поэтому потребуется некоторое время на рефакторинг и реализацию.
Комментариев нет:
Отправить комментарий