8

我有一个现有的 pom 文件,其中包含一个 maven-jar-plugin 部分。它为 test-jar 目标运行,目前不包括几个目录:

<excludes>
     <exclude>...</exclude>
     <exclude>...</exclude>
     <exclude>somedir/**</exclude>
 </excludes>

我需要在 somedir 目录中包含一个文件,但忽略 somedir 目录中的其余文件。我读过包含优先于排除,所以我添加了如下内容(之前没有包含部分):

<includes>
    <include>somedir/somefile.xml</include>
</includes>

这最终创建了一个用于测试的 jar 文件,其中只有几个文件(只是 META-INF 中的东西)。我包含的文件也不在 jar 中。我期望的是一个 jar,它与在我包含更改之前创建的 jar 与一个附加文件相同。

我在这里想念什么?

4

1 回答 1

11

首先,如果您不指定任何includes,那么 maven jar 插件将**/**用作默认模式(请参阅o.a.m.p.j.AbstractJarMojo),即它将包含所有内容。如果您覆盖此默认模式,插件显然只会包含您告诉他包含的内容。

其次,目录扫描是在最后完成的o.c.p.u.DirectoryScanner,这就是类的 javadoc 所说的:

* 这个想法很简单。递归扫描给定目录的所有文件
 * 和目录。每个文件/目录都与一组选择器匹配,
 * 包括对文件名匹配的特殊支持,包括和
 * 并排除模式。仅匹配至少一个的文件/目录
 * 包含模式列表或其他文件选择器的模式,并且不匹配
 * 排除模式列表的任何模式或未能与所需的匹配
 * 选择器将被放置在找到的文件/目录列表中。

因此,对于您当前的一组includes模式excludes,只有一个文件会匹配包含模式,但也会匹配排除模式,因此不会被选中,您会得到一个几乎空的存档(只有默认清单,请参阅 参考资料)。o.a.m.p.j.AbstractJarMojo#createArchive()

我不能在这里给您确切的解决方案,但您显然需要重新考虑包含/排除文件的方式(例如添加更多includes模式、删除<exclude>somedir/**</exclude>includes仅使用或仅使用excludes)。

于 2010-03-15T22:04:04.313 回答