不久前,我们公司启动了一项新的内部项目,该项目旨在为所有内部项目组提供服务。为了顺利推进此项目,我们秉持着“欲取先予”的理念,要求其他项目先在工程中集成我们的agent。对使用maven的项目而言,这就意味着要在pom文件中添加我们的依赖。由于是内部项目,团队成员互相协作,携手并进,大家毅然使用了我们的snapshot版本。
在项目进行过程中,一个项目组在完成war文件的构建后,将其部署到服务器上执行时遇到了问题。服务器提示某个class无法找到,经查发现是我们的agent初始化失败了。为了不影响他们的正常业务,我们紧急将agent从他们的pom文件中移除并重新发布。为什么这些class在服务器上会消失呢?我们检查了持续集成上的归档war包,发现其中缺失了多个jar包,这些jar包与我们的agent息息相关,怎么会在关键时刻缺失呢?进一步查看持续集成的日志,我们发现一个警告:
“x的POM文件无效,传递依赖(如果有)将无法使用。”看到这个警告,团队成员感到困惑,因为在本地环境中一切都运行得很好,怎么到了这里就突然无效了呢?这个持续集成是公司的另一个重要工具,因此大家一致认为是它出了问题,不能自动更新snapshot依赖,只需要清理一下本地maven库就能解决。
问题并没有就此解决。几天后,另一个项目组也遇到了同样的问题。他们使用的是老牌的持续集成工具Jenkins,并非之前那个“替罪羊”。这让我们无法再归咎于持续集成工具的问题,问题的根源最终指向了公司的私服。这个私服的设置存在问题,它默认所有的库都是release版本,没有任何机会改成snapshot版本。
经历过这次痛苦的经历后,我对某些开源软件的设计思路深感不满。对于maven来说,当发现pom是无效的并且排除传递依赖时,为什么你自信地认为这种情况下构建出的产物就是用户想要的呢?正确的做法不应该是直接构建失败吗?对于公司私服背后的未知开源软件来说,用户试图向release类型的仓库中部署snapshot版本的构建物时,你不应该直接拒绝吗?
正所谓“千里之堤毁于蚁穴”,要想避免更大的问题,我们必须及时发现问题并改正。我已经向maven提交了问题反馈,相信未来这个问题会得到解决。至于公司的私服,我猜测它可能并不是使用nexus,因为nexus是不会允许向release类型的仓库部署snapshot版本的。只有通过持续改进和优化,我们的项目才能更好地服务于用户,避免在错误的道路上越走越远。
文章来自《钓虾网小编|www.jnqjk.cn》整理于网络,文章内容不代表本站立场,转载请注明出处。