Мое приложение должно запускаться как из командной строки, так и из веб-приложения.Способ, который я выбрал для реализации этого, состоит в том, чтобы поместить все приложение в один файл jar (т.е. мои классы, специфичные для приложения, сосуществуют с классами из jar, которые использует мое приложение).Это делает случай использования командной строки простым, поскольку пользователю нужно только набрать java -jar JARNAME
.Для случая использования веб-приложения я просто включаю банку в WEB-INF/lib
, и все хорошо, почти.
Проблема, с которой я столкнулся, заключается в том, что несколько банок, которые я добавляю в одну банку, определяют провайдеровв META-INF/services
для одной и той же службы, поэтому один файл заканчивается несколькими записями в META-INF/services
с одним и тем же именем.(Любопытно, что это банки Джерси, а сервисы javax.ws.rs.ext.MessageBodyReader
и javax.ws.rs.ext.MessageBodyWriter
.) Поэтому я пытаюсь предотвратить попадание файлов службы MessageBody * в мой файл jar.Вот как я пытаюсь (и не могу) сделать это:
<jar destfile="build/jammies.jar">
<archives>
<zips>
<restrict>
<fileset dir="lib">
<include name="*.jar"/>
<exclude name="servlet-api.jar"/>
</fileset>
<rsel:not>
<rsel:name regex="META-INF/services/javax.ws.rs.ext.*"/>
</rsel:not>
</restrict>
</zips>
</archives>
</jar>
У меня есть пространство имен rsel
, определенное в верхней части build.xml
.
<project basedir="." default="compile"
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">
ИтакЯ не понимаю, почему задача restrict
не фильтрует эти файлы конкретного поставщика услуг.