Показаны сообщения с ярлыком Ant. Показать все сообщения
Показаны сообщения с ярлыком Ant. Показать все сообщения

четверг, 5 ноября 2015 г.

Решение для "Unable to locate Spring NamespaceHandler for XML schema namespace"

Дано

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

четверг, 8 мая 2014 г.

Настройка удалённого deploy для Tomcat c помощью ant

Сами задачи ant-а нормально описаны здесь : http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html#Executing_Manager_Commands_With_Ant
Но есть несколько дополнительных особенностей:

Дополнительные роли пользователей для deploy в tomcat-users.xml 

 В настройках пользователей Tomcat, в файлe .../conf/tomcat-users.xml для того пользователя, который будет указан в задачах ant-а для деплоя, добавить роль manager-script.
Т.е. для нужного пользователя строка в tomcat-users.xml будет выглядеть так :

<user name="manager" password="password" roles="admin-gui,manager-gui,manager-script" />


Ошибка PermGen при deploy

Настроить память PermGen при старте Java. Я не мелочился и ставил 256m для максимума. Настраивается в setenv.bat (или "в лоб" в catalina.bat).Если Tomcat стартован как widows-сервис, то настройка производится из пункта меню "Tomcat config"

-XX:PermSize=64m -XX:MaxPermSize=256m

Ошибка undeploy (не удаляется каталог и какие-либо библиотеки)

Суть в том, что при останове приложения часть библиотек (по разным причинам) не считаются Tomcat-ом выгруженными. Это может быть как из-за ваших утечек, так и из-за системных. В моём случае были проблемы с библиотекой oracle jdbc.
Лечится настройкой в файле .../conf/context.xml. Надо изменить строку как показано ниже : 

<Context antiJARLocking="true" antiResourceLocking="true">

среда, 4 сентября 2013 г.

Хорошие советы про ant

Хорошие советы, "странный" перевод.

Содержание:
  • Сборка только в IDE
  • Копировать-и-вставить
  • Длинные объекты
  • Большие файлы сборки
  • Не чистить
  • Сильно закодированные значения
  • Успешная сборка при неуспешных тестах
  • Волшебные машины
  • Недостаток стиля

Автоматизация для людей: Очищаем скрипты сборки от запахов