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

我遇到的问题是,我要灌入到单个罐子中的几个罐子在META-INF/services中为同一服务定义提供程序,因此单个罐子在META-INF/services中最终会以相同的名称出现多个条目。 (出于好奇,它们是Jersey的jar,服务是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任务没有过滤掉那些特定的服务提供商文件。

最佳答案

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

关于java - 从META-INF筛选出服务提供商文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8028247/

10-12 21:39