Фильтрация файлов поставщика услуг из META-INF - PullRequest
1 голос
/ 06 ноября 2011

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

1 Ответ

0 голосов
/ 10 января 2014

Я думаю, это потому, что регулярное выражение начинает совпадать со строками имени файла с самого начала, однако ни один файл не начинается с META-INF, они начинаются с $ {basedir} / WEB-INF / lib / META-INF ...

...