我的应用程序需要从命令行和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.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
任务没有过滤掉那些特定的服务提供商文件。
答案 0 :(得分:0)
我认为它是因为正则表达式从头开始匹配文件名字符串,但没有文件以META-INF开头,它们将以$ {basedir} / WEB-INF / lib / META-INF ...