【问题标题】:Maven release plugin and windows line breaksMaven 发布插件和 windows 换行
【发布时间】:2012-08-08 16:03:36
【问题描述】:

当我尝试运行 maven-release-plugin 时,它会更改 pom.xml 文件中的版本。 在 maven 发布之前,每行结尾都有 unix 样式 <lf>,但在我的 Windows 机器上运行后,插件将文件中的每一行更改为 <cr><lf>

我的问题是:

a) 有没有办法告诉 maven 保持原样或使用特定的行尾

b) 有没有一种通用的方法来告诉窗口行尾应该是什么?即使是破解操作系统深处某些东西的工具也会被认为是有帮助的。

我查看了这个https://issues.jfrog.org/jira/browse/BI-111,上面写着“已解决”,但我使用的是最新版本,它对我不起作用。

【问题讨论】:

标签: maven-release-plugin line-endings


【解决方案1】:

有四种可能的解决方案。

  1. 使用 Maven Assemly 插件

我认为最好的办法是调查Maven assembly plugin。它应该允许您更新行分隔符。有关详细信息,请参阅section“fileSet”部分。

  1. 使用 PowerShell 调用mvn

作为临时解决方法,您可以使用 PowerShell(开始->所有程序->附件->Windows PowerShell)。像你一样调用 maven,在双引号 -D 语句周围有一些额外的东西。 mvn assembly:assembly -P prod "-Dmaven.test.skip=true"。现在添加到这个 -Dline.separator=`n。这应该会导致 PowerShell 添加转义值。

  1. 在 pom 更新之前编写您自己的插件来覆盖 "line.separator"

按照Maven Guide 创建一个简单的插件。它需要做的就是覆盖价值。配置插件在 pom 修改前的阶段执行。

System.getProperties().setProperty("line.separator", "\n");
  1. 在 Linux 虚拟机中构建。

有一个选项不能纠正 Windows 兼容性问题,但应该可以解决您的核心问题。看看创建小型 VirtualBox Linux 服务器。一个简单的 NAT 连接应该足以访问 Internet。在这台机器上安装 Maven、Java 等。建立在它之上。因为它是 Linux,所以行分隔符应该只有 '\n'。 VM 需要 256 - 512 MB 的 RAM 和 20 GB 的存储空间(Linux + 很多可能的 Maven 依赖项)。如果你最终喜欢它,你甚至可以扩展它以容纳像 Jenkins 这样的持续集成产品。

【讨论】:

  • 是maven-release-plugin使用maven-assembly-plugin吗?
  • 不,这是您的 maven 项目的新依赖项。
  • 所以我不相信这行得通,因为 Maven-Release-Plugin 的 release:prepare 目标修改了 pom 并提交了它们。 - 或者你有没有看到任何挂钩的方法,以便 Maven-Assembly-Plugin 在 Maven-Release-Plugin 修改代码之后但在 Maven-Release-Plugin 提交之前更正换行符。
  • 好提示:ReleaseUtil.LS;不是绝对硬编码,它的值取自系统属性public static final String LS = System.getProperty( "line.separator" );——所以我需要找到一种方法,以便在执行发布插件时设置系统属性。
  • @Virmundi:我奖励这个答案,因为为了尊重你的工作,即使 linux/vm 解决方案对我来说不是解决方案。对于 maven assambly 解决方案:我看不出这应该如何工作。
【解决方案2】:

我在 Windows (CRLF) 上工作,并在我的文件中使用 LF 结尾。我使用 Git。

我选择将core.autocrlf 设置为input。根据https://git-scm.com/book/en/v2/Customizing-Git-Git-Configurationinput设置是针对这种情况的:

如果您使用的是使用 LF 换行符的 Linux 或 Mac 系统,那么您不希望 Git 在您检出文件时自动转换它们;但是,如果意外引入了带有 CRLF 结尾的文件,那么您可能希望 Git 修复它。您可以通过将 core.autocrlf 设置为 input 来告诉 Git 在提交时将 CRLF 转换为 LF,但不能相反。

但是,当我在 Windows 上时,它对我很有效。如果你的情况类似,可以试试看:

  • 如果 CRLF 文件被提交到存储库,则 CRLF 行结尾将在结帐时可见。因此可以做出反应(例如提醒同事注意行尾)。
  • 使用 Maven 发布插件不会导致 pom.xml 使用 CRLF 提交(它将是 LF)。

缺点:

  • 解决方案取决于机器。人们可能会忘记在从另一台机器发布之前验证 Git 设置,从而导致 CRLF pom.xml 被提交。

【讨论】:

    【解决方案3】:

    在 Linux 中工作,但希望在例如 Windows 行结尾set-versions 输出,这个快速修复对我有用:

    mvn -Dline.separator=$'\r\n' \
        -DautoVersionSubmodules=true \
        -DdevelopmentVersion=1.2.3-SNAPSHOT \
        release:update-versions
    

    【讨论】:

      【解决方案4】:

      我的解决方法是使用 SVN 属性:svn:eol-style=native。所以 SVN 在更新或提交时“转换”pom.xml

      【讨论】:

      • 每个源代码控制管理都有这样一个特性:每个人在不同操作系统上与多个团队一起工作都是这样的
      猜你喜欢
      • 2013-01-16
      • 2012-10-14
      • 2018-06-02
      • 2015-04-21
      • 2013-09-06
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      相关资源
      最近更新 更多