- 我是一个线程(修订版)
- 我是一个 Java class
- Javascript:一个屌丝的逆袭
- Java : 一个帝国的诞生
- JSP 一个装配工的没落
- TCP/IP 之 大明王朝邮差
- TCP/IP 之大明内阁
- TCP/IP 之蓟辽督师
- CPU 阿甘
- CPU 阿甘之烦恼
- CPU 阿甘:函数调用的秘密
- 我是一个网卡
- 我是一个路由器
- 我是一个进程
- 我是一块硬盘(上)
- 我是一块硬盘(下)
- 我是一个键盘
- 张大胖的 socket
- 张大胖学递归
- 学习面向对象的令狐冲
- 张大胖学数据库
- 数据库村的旺财和小强
- 小李的数据库之旅(上)
- 小李的数据库之旅(下)
- 漫画:什么是机器学习?
- 那些烦人的同步和互斥问题
- IE 为什么把火狐和 Chrome 给打伤了?
- 对浏览器村的第二次采访
- 节约标兵 IE 的自述
- EMail 诞生记
- Email 诞生记(下)
- Http 历险记(上)
- Http 历险记(下)-- Struts 的秘密
- 动物王国的面向对象
- 冯·诺伊曼计算机的诞生
- Http Server : 一个差生的逆袭
- 张大胖的加法器
- 从 1 加到 100:一道简单的数学题挑战下你的大脑
- 编程语言
- Javascript:一个屌丝的逆袭
- 计算机语言之战
- 我和编程语言的爱恨情仇(上)
- 我和编程语言的爱恨情仇(下)
- Android 为什么选择了 Java
- iOS 为什么选择了 Object-C?
- Basic : 一个老兵的自述
- Node.js : 我只需要一个店小二
- 命令式编程 vs 声明式编程
- 编译还是解释?
- 程序人生
- “架构师"小赵
- 师兄说
- 师姐说
- 小王的架构师之路
- 小李的版本管理系统
- 小超穿越记
- 小李的 Build 之路(上)
- 小李的 Build 之路(下)
- 张大胖改 Bug
- 我的编程之路--大学趣事
- 码农小王的一天
- 小李在外企
- 张大胖的需求估算
- 从厨师到码农
- 聊一聊那些神一样的程序员们(上)
- 聊一聊那些神一样的程序员们(中)
- 聊一聊那些神一样的程序员们(下)
- 谁是互联网之父?
- 一个价值百万的创业教训
- 让自己与众不同 - 提升工作的价值
- 看看你的“易燃性”
- 从无聊的工作中寻找价值
- 什么样的学生适合报考计算机?
- 谈谈程序员的职业方向(上)
- 谈谈程序员的职业方向(中)
- 谈谈程序员的职业方向(下)
- 谈谈培训班的作用
- 码农需要知道的“潜规则”
- 学习编程的加速度
- 码农在工作中的必备能力
- 码农和英语
- 老司机经验
- 假如时光能够倒流, 我会这么学习 Java
- 假如我是计算机系老师
- 学会编程, 而不是学会 Java
- 从增删改查中突围
- 抽象:程序员必备的能力
- 懒就一个字
- 编程的自学方法
- 小王买房记
- 从一道面试题谈谈一线码农应该具备的基本素质
- 想写框架的看过来
- 苹果手机变砖头以后
- 如何快速的学习一门技术?
- 唯一不变的是变化: 谈谈微信应用号
- 什么是企业应用?
- 勿以浮沙筑高台
- 为什么敏捷开发难于成功?
- localhost vs 127.0.0.1
- GitHub/Stackoverflow 找工作时有什么用?
- 动词 or 名词 :这是一个问题
- 如何选择入行语言
- 有时候,沉默是金
- 零 Bug 的代码是怎么炼成的?
- 浮点数为什么不精确?
- 文章错误大全
- Open Source--不要为了开源而开源
- 一不留神,代码就腐化了
- 先做个“键盘侠”, 再来写程序
- 不加断点调试的程序员是好程序员
- 码农必备技能:烂代码的处理之道(上)
- 码农必备技能:烂代码的处理之道(下)
- 学习数据结构有用吗?
- 从现在开始,丰富你的简历
- 那些永不过时的书,你看过几本吗?
- 学好编程必备的一个品质你知道吗?
- 你最爱的 Java
- 搞懂了这几点,你就学会了 Web 编程
- Spring 的本质系列(1) -- 依赖注入
- Spring 本质系列(2)-AOP
- 三层架构和 MVC 那点事儿
- Java 帝国之拨云见日识回调
- 小张的 Duck Typing
- JDBC 的诞生
- JDBC 后传
- 一个不安分的 JDBC 驱动
- Java 帝国之 Java bean (上)
- Java 帝国之 Java bean(下)
- Java 帝国之函数式编程
- Java 帝国之函数式编程(下)
- 关于 Java 初学者需要知道的 10 件事
- JUnit 你不知道的那些事儿
- 圣诞礼物:Java EE 的历史
- Java EE 读书指南
- 给小白的 Java EE 指南
- 给小白的 Java EE 指南(2)
- 给小白的 Java EE 生存指南(3) : XML
- 给小白的 Java EE 生存指南(4) : 一只叫 Tom 的猫
- 给小白的 Java EE 指南(5) : AJAX
- 给小白的 Java EE 生存指南(6) :Java 反射
- 闲聊
- "饿了么"初体验
- 来自大脑的控诉
- 一个高中生是怎么玩自媒体的?
- 尝试 分答
- 到底应不应该上培训班?
- 自学编程中遇到问题怎么办?
- 据说 99%的初级程序员看完后都不迷茫了
- 一行代码引发的“血案”
- 对一个死锁问题的思考
- 通过外包进入名企
- 请开往十年前的今天
- 为什么自学中最好有个师傅指导一下?
- 这个网站值得你花时间投入
- 为什么你无法坚持自学编程?
小李的 Build 之路(下)
前言: 接上一篇《小李的 Build 之路(上)》
小李发明的 ANT 确实是好用, 现在不仅仅是小李的公司, 连其他公司的朋友听说了,也拿去使用, 交口称赞。
只是小李发现了一点奇怪的现象,每个人在开始写新项目的 Ant build 文件之前, 都会找到自己说: “小李, 把你那个 build.xml 文件发我一份吧, 让我参考下。”
小李的那一份 build.xml 其实是自己项目的第一个 ant 脚本, 为啥大家都要把它
Copy 走呢? 刚开始的时候小李以为大家不会写,要按照自己的模板照葫芦画瓢。
偶然有一次,小李看到了别人项目的 Ant build 脚本, 不由得大吃一惊, 这简直和自己原始的 build.xml 如出一辙。
小李赶紧把公司内所有项目的 Ant 脚本都要过来,仔细观察了一下, 很快就发现了这些脚本中蕴藏着一些共同的“模式”,这些模式主要体现在 Build 的步骤上:
1. 从版本控制系统下载代码 2. 编译 java 文件,形成 jar 包 3. 运行单元测试 4. 生成代码覆盖度报告和测试报告 4. 打包形成 war 文件 5. 上传到测试服务器上,进行安装
其实这也难怪,实际的 Build 不就是这样的嘛。 但是中间也有不同之处:
(1) 路径不同,例如 java 源文件 下载下来以后放的位置不同,五花八门 编译成的 java class 放置的位置不同 测试报告放置不同 war 包生成后放置的路径不同 。。。 (2) 项目依赖不同,例如 各个项目依赖的第三方 jar 包可能是不一样的 各个项目都有一个 Web 子项目,它依赖于其他 java 项目,所以在 build 的时候,要先 build 这些 java 项目才行 例如下图中的 OnlineShop,这是个 Web 项目, 它依赖于 ApplicationConfg, LoggingFramework, OnlineShopApi 这三个子项目。
项目依赖这个没办法, 毕竟是各个项目的业务所要求的,小李没有办法改变。
但是那些不同的路径真的是必要的吗? 能不能让大家的路径都保持一致呢 ?
一个新的主意像闪电一样划过黑暗的夜空: 确实可以保持一致, 但是大家都要遵循一定的约定 如果大家都这么做,小李就可以增强一下 Ant,只要运行 ant complie , 就会 自动 的去 src/main/java 找到源文件进行编译, 只要运行 ant test, 就会 自动 去 src/test/java 找到测试用例, 编译并运行。
换句话说, 只要遵循目录的约定, 大家就不用费心费力的指定各种路径了, 一切在背后由工具自动搞定, 这样的话 Build 脚本就可以极大的简化了 ,只需要寥寥几行即可。
这只是一个 java 项目,要是多个 java 项目,有依赖关系,像上面提到的 OnlineShop 依赖 OnlineShopAPI, AppplicationConfig, LoggingFramework , 该怎么处理?
这也不难, 小李想, 首先每个 java 项目都得遵守上述约定,其次需要定义项目之间的依赖关系, 也可以用 XML 描述出来。
每个 java 项目都需要有个叫 pom.xml 的文件, 例如 OnlineShop 这个项目的 pom 如下:
这样以来工具就能自动找到被依赖的项目, 然后去编译打包它了。
此外,各个 java 项目之间也需要按约定来组织目录,例如: +- pom.xml +- online-shop-web | +- pom.xml | +- src | +- main | +- webapp +- online-shop-api | +- pom.xml | +- src | +- main | +- java +- logging-framework | +- pom.xml | +- src | +- main | +- java +- app-config | +- pom.xml | +- src | +- main | +- java
如果扩展一下, 把第三方的 jar 文件例如 JUnit 也可以给用这种方式来描述: 想到这一层,小李不禁激动起来,因为第三方的 jar 管理一直是一个令人头疼的问题,最早的时候大家都是手工的 Copy 来 Copy 去, 由于版本不同导致的错误特别难于发现。
每个人在建立自己 Eclipse workspace 的时候, 得拿到所有依赖的 jar 包, 并且在项目上设置好, 可是非常的费劲啊。
如果利用这种 声明的办法 , 每个人岂不卸下了一个巨大的包袱 ?
当然公司需要建立一个公用的第三方 jar 文件版本库, 把公司最常用的第三方 jar 包都放进去, 工具在分析项目的配置文件 pom.xml 的时候,就可以去公司的版本库里去读取并且下载到本地。
将来有新人进入公司, 只要给他一个 pom.xml , 用 Eclipse 导入,就能轻松的把一个可以直接运行的 workspace 建立起来, 再也不需要设置那些烦心的 jar 了。
如果将来在网络上建立公开的软件版本库, 任何人都可以从那里去下载各种软件包,那受惠的可不仅仅是自己公司了, 而是所有人,真是一个激动人心的场景啊。
不过还是从自己公司开始吧, 小李冷静下来分析了一下: 让所有的项目组都使用约定的目录,并且建立一个公司级别的软件库,自己可是没有这样的权限啊, 小李去找 CTO 老张求助。
老张不愧是老江湖, 听了几分钟小李的介绍,马上就明白了, 并且把这个想法提升了一个高度:
“你这叫 约定重于配置 , 知道不? 从 Ruby on Rails 开始,这个词开始流行了, 大家现在都很忙, Ant build 脚本用的也没问题,先不改了”
小李还不死心: “可是这么做的话对以后的新项目大有好处啊,不用 Copy 繁琐的 build 脚本了, 也不用费心的折腾 workspace 了”
“那也不能现在改,项目进度最重要,大家都没时间, 这样吧,等大家项目闲下来再改动如何? ” 老张妥协了一下。
可是在公司基本上就不会有空闲的时间, 一个个新需求压的大家透不过气来,偶尔有空闲时间,大家也都犯懒了, 总是想休息。
此外惯性的力量是惊人的,大家都愿意待在舒适区里, 不愿意变化, 虽然也看到了新工具的好处, 大家都懒得换新的。
时间过的很快,一年过去了, 小李看着自己辛辛苦苦加班写出来的 Ant 2.0 , 还是无人采用, 很是伤心。
经过公司的允许, 小李决定把这个工具开源, 为了和 Ant 区分开来, 特地起了个新的名称: Maven。
Maven 迅速被大家用了起来,除了小李的公司。
又过了半年, 小李跳槽了。
即日起,您只需免费接入 DaoVoice,即有机会赢取大疆无人机、XBox 等惊喜大礼!
DaoVoice 是一款革命性的应用运营平台,融合了「在线聊天」、「客服支持」、「用户画像」、「行为引导」等功能为一体, 按需获取用户信息和行为,实现场景化消息推送,让通知更富有人情味。
点击“ 阅读原文 ”,了解更多活动详情。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论