从META-INF过滤掉服务提供者文件

时间:2011-11-06 15:56:44

标签: java ant jar jersey

我的应用程序需要从命令行和Web应用程序运行。我选择实现这个的方法是将整个应用程序放在一个jar文件中(即我的应用程序特定的类与我的应用程序使用的jar中的类共存)。这使命令行用例变得简单,因为用户只需键入java -jar JARNAME。对于Web应用程序用例,我只需在WEB-INF/lib中包含jar,几乎一切都很好。

我遇到的问题是,我正在啜饮到单个jar中的一些罐子在META-INF/services中为同一服务定义了提供者,因此单个jar在META-INF/services中以多个条目结束同名。 (好奇的是,这些是Jersey jars,服务是javax.ws.rs.ext.MessageBodyReaderjavax.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 :(得分:0)

我认为它是因为正则表达式从头开始匹配文件名字符串,但没有文件以META-INF开头,它们将以$ {basedir} / WEB-INF / lib / META-INF ...