2016-11-28 48 views
0

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

  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”与“批处理”任务,以及跨多台机器协调构建)
  4. 在虚拟机中运行Windows,Linux和Mac的速度太慢了,脆弱。即使你运行起来,试图将虚拟机配置成詹金斯奴隶也是一个令人沮丧的教训(你会经常发生间歇性的构建错误)。
  5. 的Maven中央要求有关特定于平台的文物主要罐子:OSSRH-975
  6. Sonatype OSS Repository Hostingmaven-release-plugin认为有可能在一台机器在一个原子的方式来释放一个项目。

我打算使用这个Stackoverflow问题来记录我如何设法克服这些限制。

回答

0

这里是我克服了上述问题:

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

见我Requirements API为一个可行的现实生活中的例子。

相关问题