如何抑制 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 程序集插件跳过已添加的文件?还是允许覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

跳过已应用的补丁时使“补丁”返回 0

使用Maven程序集插件创建WAR文件

Xcopy共享违规,如何仍然复制而不跳过

跳过Maven 打包时的测试,如何跳过Maven 打包测试

使用Maven程序集插件检测丢失的包含文件

如何使 Maven 发布插件跳过测试?