使用Maven构建和部署本机代码

时间:2016-11-28 21:31:38

标签: maven maven-release-plugin

我花了数年时间尝试将使用本机代码的库部署到Maven Central。我遇到了以下问题:

  1. 使用Maven构建本机代码没有任何好的插件。 native-maven-plugin是一个非常严格的构建系统,除其他外,它使得调试生成的二进制文件变得困难。您必须手动将native-maven-plugin构建系统与用于调试的本机IDE同步。
  2. Maven没有替换已部署的pom.xml文件中的变量:MNG-2971MNG-4223。这意味着库必须为每个Maven配置文件声明一次特定于平台的依赖项(而不是一次声明依赖项并为每个配置文件设置不同的分类器);否则,任何依赖您的库的人都必须在其项目文件中重新定义这些相同的属性,以便解决传递依赖性。见Maven: Using inherited property in dependency classifier causes build failure
  3. Jenkins极力支持在不同平台上运行类似逻辑(例如" shell" vs"批处理"任务,以及跨多台计算机协调构建)
  4. 在虚拟机中运行Windows,Linux和Mac太慢而且脆弱。即使你让它工作,尝试将虚拟机配置为詹金斯的奴隶也是一个令人沮丧的教训(你经常会出现间歇性的构建错误)。
  5. Maven Central需要一个主jar来处理特定于平台的工件:OSSRH-975
  6. Sonatype OSS Repository Hostingmaven-release-plugin认为可以从一台机器以原子方式发布项目。
  7. 我将使用此Stackoverflow问题来记录我是如何设法克服这些限制的。

1 个答案:

答案 0 :(得分:1)

以下是我克服上述问题的方法:

  1. 我使用CMake来构建本机代码。该系统的优点在于它为您喜欢的(本机)IDE生成项目文件。您使用相同的项目文件来编译和调试代码。您不再需要手动同步两个系统。
  2. 我手动将特定于平台的依赖项硬编码到每个Maven配置文件中,而不是使用每个配置文件使用不同的分类器来定义依赖项。这是更多的工作,但看起来他们不会很快修复Maven中的这个错误。
  3. Jenkins pipeline可以很好地协调多台计算机上的构建。
  4. 在虚拟机上运行Jenkins从属设备仍然非常容易出错,但我已成功解决了大部分问题。我上传了VMWare configuration stepsJenkins job configuration以帮助其他人上手。
  5. 我现在create an empty JAR file了解特定于平台的工件,以便抑制Sonatype错误。这实际上是Sonatype的支持人员推荐的。
  6. maven-release-plugin将turns out委托给引擎盖下的其他插件。我没有调用它,而是执行以下操作:
    1. 使用mvn versions:set将版本号从SNAPSHOT更改为版本并返回。
    2. 自行标记并提交发布。
    3. 使用nexus-staging:rc-opennexus-staging:deploy -DstagingProfileId=${stagingProfileId} -DstagingRepositoryId=${stagingRepositoryId}nexus-staging:rc-close将来自不同平台的工件上传到同一存储库中。
    4. 审核后,将存储库发布到Maven Central。
    5. 重要提示:请勿在{{1​​}}插件中启用<autoReleaseAfterClose>,因为它会在每次部署后关闭暂存存储库,而不是等待所有部署完成。
  7. 请参阅我的Requirements API了解有效的实际示例。