今天读了《系列文章整理 - “听”乔梁讲述持续集成的故事》,其中一些观点非常赞同,其中提到一个Java领域中一个很有名气的项目管理工具:Maven,特别想对此多说几句,于是形成此文~~
先说个题外话,老的Java程序员一看到Maven就想起Ant,而实际本站的代码构建也是用的Ant,不过Maven和Ant的关注点真的不是很一样,Ant帮你执行很多脚本目标,仅此而已,是个很好的工具,可以用它做很多你想做的事情,但是Maven远不止此,Maven更像是一个项目管理工具,它传达出了一些很好的思路和最佳实践~~
OK,现在开始侃一侃~~
1、测试代码与功能代码同源
用Maven创建的项目普遍都有两个源码目录,一个叫src,另一个叫test,src下是存放的业务逻辑相关的代码,test下是存放的测试用例。有些人可能并没有意识到这点有啥了不起的,他们可能使用自己的平台来管理测试用例代码脚本云云。不过在敏捷实战中,测试用例,特别是单测,是为所有人服务的,包括开发人员,在TDD实战中甚至主张测试先行。当然,如果你还在使用传统的瀑布开发方法,可能这么做的意义的确不大。对于测试代码和功能代码分开管理的弊端,比如测试代码更新不及时,为了让保证上线时间,直接注释掉一些过时的测试用例,开发人员不方便在开发过程中写单测,以至于直接放弃单测等等。所以,感觉Maven的这种做法,很值得推荐
1.1、延伸一下,其他脚本也要放到源码库中
比如服务的启停脚本,部署脚本,都应该有版本控制,保证可追溯,便于审计,同时功能代码变了,部署方式和服务启停脚本也很可能同步修改,放到svn、git中吧,乔帮主都说了:Everything is code,还犹豫个啥捏?呵呵
2、配置文件要单独抽取出来
一般来讲Maven会在src和test目录下创建一个resources目录来管理一些配置文件,具体什么配置呢?比如数据库连接配置,缓存配置,程序的业务逻辑配置,功能开关,log配置等等。还有程序在运行过程中需要的比较大的数据,如果不方便打包进来的话也可以转化为配置,只是在配置文件中描述一下这些大数据的下载地址即可。另外,对于服务的关联关系,比如所依赖的上游服务的IP地址之类的,不建议放到配置里,这应该是Naming Service应该解决的问题,不过关联关系的name本身倒是可以放在配置中。对于Maven本身而言,它会把配置和代码的编译产物打到一个包里,这点值得商榷,在某些场景下,配置单独出来会更方便。举个例子:代码关着开关上线,此时服务不需要停摆,然后再单独发起一次开开关的动作,因为只是对配置本身做了修改,此时对于部署脚本应该可以判断二进制bin文件没有修改不用重新下载并更新,只是下载conf更新一下即可,如果发现开开关的这个版本有问题,可以很快再上一个关开关的版本用于回滚,但是对于conf和bin打包在一起的情况,部署脚本就很难做出这样的判断,每次都下载bin文件比较不值得
3、对于不同的环境,单独准备conf文件
因为有了第二步的做法,即把配置文件单独抽取出来了,这样还有另外一个好处,比如:现在有多套环境的情况,开发人员有个CI单测环境,测试人员有个自动化集成测试环境,再来个沙盒环境,验收测试环境,线上环境,这样会有多套环境,而各个环境可能配置文件不同,这个问题也是我现在工作中遇到的一个很麻烦的问题,Maven的解决方案是:对不同的环境准备不同的conf,然后再打包的时候根据传入的环境ID来获取相应的配置文件,这样做,实际是为每个环境单独编译打包了一份,我只能说是一种方案,好不好,还是比较难以评论,因为我现在也没想明白,呵呵,有相关经验的朋友期望能赐教一二。
4、模块的依赖管理
依赖可以分为三种,编译时依赖,测试时依赖,运行时依赖,Maven的scope就是描述这几种类别的
不过这不是关键,依赖管理里很关键的做法是通过描述一个lib库的identity来让Maven找到这个jar,这个identity包含了一个可寻址的名称和version,这样一来maven在编译打包的时候就可以找到这个jar并下载到本地,并且在最终打包的时候一起打到发布包里,这么做很赞,好在哪里?从部署的角度来考虑,这个包对外的依赖很少,要想服务run起来只要在本地准备一个JDK(如果是WEB服务还需要有个WEB容器)就可以,换句话说叫容易部署,呵呵,当然,如果把JDK和WEB容器一起打包进去就更好了,不管是服务扩容还是搭建环境都很容易。从这个角度来看C模块的动态链接库就会比较麻烦,因为依赖问题是部署不友好的,于是~~~Google的C模块统统用的静态链接库,于是~~~Canonical要开发自己的包管理工具,O(∩_∩)O~
今天先扯到这吧,北京这天气。。。从冬天一下子到了夏天,好热。。。
相关推荐
这可能包括IDE(集成开发环境)如IntelliJ IDEA或Visual Studio Code,版本控制系统如Git,构建工具如Maven或Gradle,以及测试框架如JUnit或Selenium。掌握这些工具的高级用法是专业开发者必备的技能。 3. **阅读...
在Java中,可以使用Jenkin、Maven等工具进行持续集成和部署,同时利用Java的网络编程能力,实现设备之间的通信和数据交换,从而构建高效、安全的智能家居环境。 ### 结论 虽然原始文本主要关注个人喜好和生活细节...
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!