【发布时间】:2014-01-10 18:04:05
【问题描述】:
我的应用程序需要同时从命令行和网络应用程序运行。我选择实现这一点的方式是将整个应用程序放在一个 jar 文件中(即我的应用程序特定的类与我的应用程序使用的 jar 中的类共存)。这使得命令行用例变得简单,因为用户只需键入java -jar JARNAME。对于 Web 应用程序用例,我只是将 jar 包含在 WEB-INF/lib 中,几乎一切都很好。
我遇到的问题是,我在单个 jar 中的一些 jar 为同一服务定义了 META-INF/services 中的提供程序,因此单个 jar 最终在 META-INF/services 中有多个具有相同名称的条目. (出于好奇,这些是 Jersey jar,服务是 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>
我确实在build.xml 的顶部定义了rsel 命名空间。
<project basedir="." default="compile"
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">
所以我不明白为什么restrict 任务没有过滤掉那些特定的服务提供者文件。
【问题讨论】: