如何抑制 maven 程序集插件跳过已添加的文件?还是允许覆盖?
Posted
技术标签:
【中文标题】如何抑制 maven 程序集插件跳过已添加的文件?还是允许覆盖?【英文标题】:How do I suppress maven assembly plugin skipping files that are already added? Or allow overwrite? 【发布时间】:2011-02-05 12:02:28 【问题描述】:几周以来,我一直在与 maven 搏斗,让它“正确”部署我们的项目。
我差不多完成了,但我有一个顽固的小问题:
当我使用带有“目录”目标的 maven 程序集插件时
mvn assembly:directory
我得到很多控制台输出,如下所示:
[INFO] tomcat/conf already added, skipping
[INFO] tomcat/conf/Catalina already added, skipping
[INFO] tomcat/conf/Catalina/localhost already added, skipping
[INFO] tomcat/webapps already added, skipping
我已经编写了自己的程序集描述符,它基本上将几个 FileSet 复制到我们部署目录中的各个子目录中。每当将一个 FileSet 中的文件复制到另一个 FileSet 已经创建基本目录结构(以及一些可以覆盖的“默认”文件)的位置时,就会出现上述消息。
所以,我很难弄清楚:
我该如何 1) 隐藏这些消息(但只有“已添加”的消息)或 2) 允许覆盖?
【问题讨论】:
【参考方案1】:如果我理解你的问题是正确的,你应该使用maven-dependency plugin 来复制文件/覆盖而不是使用程序集插件...
【讨论】:
感谢您的回复。 maven-dependency-plugin 似乎不太适合我的需求。事实上,我在几周前尝试过它,在深入研究之后,我发现它比文件集更适合复制工件(例如 JUnit)。似乎 assembly:directory 目标是将文件集移动(组装)到输出目录的更好选择。据我所知,组装插件适用于您想将事物组合在一个地方,通常用于压缩。现在,我唯一的问题是我不知道如何抑制/避免“已经添加”的消息。 嗯.. maven-dependency-plugin (maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html) 似乎正是您所需要的(它具有覆盖选项等).. 将工件(文件)复制到特定位置.. .也许看看maven-cargo-plugin(cargo.codehaus.org/Maven2+plugin)是个好主意,因为它可以启动/停止/部署到tomcat等。顺便说一句:你使用哪个版本的程序集插件?可能会更新到最新的.. 这并不能完全解决我的问题,但我会接受你的回答,因为我没有其他人。重要的是思想,对吧?大声笑 @gmale 如果他们不回答您的问题,则不接受答案。我来是希望能解决我的问题。我很失望:( @gmale 为什么不支持它,但在发布正确答案 之前不接受它(例如 vocaro 的)?【参考方案2】:信息消息来自 Plexus 存档器。关于这个问题有一个开放的错误报告:
http://jira.codehaus.org/browse/PLXCOMP-129
【讨论】:
更新到最新版本的 maven-assembly-plugin 为我修复了它。 @GuiSim 感谢它对我有用。我用的是 2.5.5 版本。 maven.apache.org/plugins/maven-assembly-plugin/usage.html 顺便说一下链接坏了。【参考方案3】:最好使用 maven-resources-plugin 和 copy-resources 目标将您需要的目录集中到一个地方。为您的基本目录结构创建一个执行,并为自定义部分添加后续执行。将目标的覆盖属性设置为 true 将确保自定义文件将覆盖默认值。
然后在你的程序集描述符中使用你刚刚创建的文件集。
【讨论】:
【参考方案4】:maven 3.0.4:
在制作单个 jar 或组合源进行分发时,我仍然会收到这些消息。 http://jira.codehaus.org/browse/PLXCOMP-129 似乎不在maven中。
我的解决方法是使用各种排除模式,尤其是文件夹的 %regex[..]。我不知道这是多么稳定或一般,显然它需要维护。但是,我们处于收到如此多消息的情况下,当真正的消息出现时我们看不到我们需要做点什么。
跳过通知,许可证——我将正确的合并文本版本放在程序集的后面。无论如何,依赖项中的部分内容还不够好。
匹配文件夹名称会排除所有内容,而不是文件夹本身。文件夹确实出现在输出中,并且没有 INFO 级别的“跳过”消息。
<unpackOptions>
<excludes>
<exclude>**/NOTICE*</exclude>
<exclude>**/LICENSE*</exclude>
<exclude>**/DEPENDENCIES*</exclude>
<exclude>META-INF/**</exclude>
<!-- Exclude folders - this removes "skipping" messages -->
<exclude>%regex[.*/]</exclude>
</excludes>
</unpackOptions>
【讨论】:
【参考方案5】:vocaro 提到的 Plexus 错误已得到修复。将 maven-assembly-plugin 与 2.4 版(撰写本文时的最高版本)一起使用不会打印详细消息。
【讨论】:
这为我解决了这个烦人的问题。谢谢!【参考方案6】:升级到 Maven 3.1.x 或更高版本 - 请参阅 http://maven.apache.org/maven-logging.html
从 Maven 3.1.0 开始的标准 Maven 发行版使用 SLF4J API 结合 SLF4J Simple 实现进行日志记录。
现在使用 simplelogger,我们可以对日志消息进行细粒度控制。要确定哪个记录器导致了不需要的消息,请编辑 MAVEN_HOME/conf/logging/simplelogger.properties 并更改以下内容:
org.slf4j.simpleLogger.showLogName=true
观察构建输出中不需要的垃圾:
[INFO] org.codehaus.plexus.archiver.jar.JarArchiver - META-INF/MANIFEST.MF already added, skipping
返回 simplelogger.properties,按类名降低违规记录器的日志记录级别(还将 showLogName 设置回 false)
org.slf4j.simpleLogger.log.org.codehaus.plexus.archiver.jar.JarArchiver=warn
【讨论】:
以上是关于如何抑制 maven 程序集插件跳过已添加的文件?还是允许覆盖?的主要内容,如果未能解决你的问题,请参考以下文章