软件开发领域遇到的问题
1 开发中的实际问题
1.1
小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流
——需求之一:备份!
1.2
这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的代码已经回不到从前了。什么地方能买到哆啦A梦的时光机啊?
——需求之二:代码还原!
1.3
小刚和小强先后从文件服务器上下载了同一个文件:Analysis.java。小刚在Analysis.java文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;小强在Analysis.java文件中的第50行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记忆中了
——需求之三:协同修改!
1.4老许是一位项目经理,我会告诉你他把每一个版本都保存一份吗?我会告诉你这些工程里其实有很多文件都是重复的吗?我会告诉你老许为这事删了很多电影吗?
——需求之四:多版本项目文件管理!
1.5老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这次来说吧,有个该死的Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘流和正经牛都不承认是自己干的!
——需求之五:追溯问题代码的编写人和编写时间!
1.6小温这两天幸福的如同掉进了蜜罐里,因为他成功的得到了前台MM丽丽的芳心,可他郁闷的是这几天总是收到QA小组的邮件,要求他修正程序中存在的Bug,可他自己本地电脑上是没有这些Bug的,“难道我的代码被哪个孙子给改了?”。是的,小温没来的时候,丽丽是QA小组小郑的女朋友啊!
——需求之六:权限控制!
SVN !!!
SVN概述
项目管理中版本控制的问题
通常软件开发由多人协作开发,如果对代码文件、配置文件、文档等没有进行版本控制,将会出现很多问题:
代码管理混乱
备份多个版本,占用磁盘空间大
解决代码冲突困难
容易引发BUG
难于追溯问题代码的修改人和修改时间
难于恢复至以前正确版本
无法进行权限控制
项目版本发布困难
什么是版本控制
版本控制(Revision control)是维护工程蓝图的标准做法,能追踪工程蓝图从诞生到定案的过程。是一种记录多个文件内容变化,以便将来查阅特定版本修订情况的系统。
主流的版本控制
VSS:Visual Source Safe(Microsoft Visual Studio成员)主要任务是负责项目文件的管理
CVS:march-hare出品的一套用于进行文件版本控制软件
SVN:Apache软件基金会名下的一套用于进行文件版本控制软件
在2000年初,开发人员要写一个CVS的自由软件代替品,它保留CVS的基本思想,但没有它的错误和局限,保留CVS的基本特性但去除CVS的bug和不好的特性。
在2000年2月,他们联系《使用CVS开发开源项目》(Open Source Development with CVS)(Coriolis, 1999)的作者Karl Fogel,并征求了他是否愿意在这个新的项目中担任一个角色。巧合的是,当时Karl已经和他的朋友Jim Blandy讨论了一个关于新的版本控制系统的设计。在1995年,这两人就成立了Cyclic Software,一个提供CVS的商业支持的软件公司。虽然他们经营商业服务,但是仍然在每天都在工作中使用CVS。使用CVS的挫折感使得Jim认真思考更好的方法来管理数据,不但确定名字为“Subversion”,而且完成了Subversion档案库的基础设计。
当CollabNet的电话到来时,Karl立即答应了加入项目中,而且Jim让他的雇主RedHat Software同意让他在这个项目中不定期工作。CollabNet雇用了Karl和Ben Collins-Sussman,并在5月开始了详细设计工作。在得到了来自CollabNet的Brian Behlendorf、Jason Robbins和Greg Stein(当时是一名活跃在WebDAV/DeltaV规范过程的自由程序员)很多创意的帮助下,Subversion很快地引起了一个活跃开发者社区的注意。它找出并欢迎很多同样在CVS上受到挫折的社员能来为这个项目做点什么。
Subversion 最初的设计Team定下了几个简单的目标。 它必须在功能上可取代 CVS,也就是说, 所有 CVS 可做到的事, 它都要能够作到。 在修正最明显的瑕疵的同时, 还要保留相同的开发模式。 还有, Subversion 应该要和 CVS 很相像, 任何 CVS 使用者只要花费少许的力气, 就可以很快地上手。
经过十四个月的编码后, Subversion 于2001年8月31日开始实现 “自行管理”。 也就是说, 开发人员不再使用 CVS 来管理 Subversion 的代码, 而以 Subversion 自己来管理。
2009年11月,Subversion被Apache Incubator专案所接收。
2010年1月,正式成为Apache软件基金会的一个顶级专案,所以为Apache Subversion.
目前Apache Subversion的主席为Greg Stein, 项目领导者Re*andisco公司。
什么是SVN
SVN(Subversion)是近年来崛起的版本管理工具,在当前的开源项目里(J2EE),几乎95%以上的项目都用到了 SVN。Subversion 项目的初衷是为了替换当年开源社区最为流行的版本控制软件 CVS,在 CVS的功能的基础上有很多的提升同时也能较好的解决 CVS 系统的一些不足。
SVN的作用
针对软件研发企业的软件生产过程而言,SVN用于管理整个开发过程中的源码,进行版本控制。
SVN的使用
C/S
Client
Server
B/S
Browser
Server
C/S是基于客户模式
B/S是基于浏览器模式
凡是有应用的都是C/S,在浏览器界面操作的才是B/S
svn是基于客户/服务器模式:
复制-修改-合并方案(Subversion默认的模式)
在这种模型里,每一个客户读取项目配置库建立一个私有工作副本——版本库中文件和目录的本地映射。用户并行工作,修改各自的工作副本,最终,各个私有的复制合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。
锁定-修改-解锁方案
在这样的模型里,在一个时间段里配置库的一个文件只允许被一个人修改。 此模式不适合软件开发这种工作。
SVN安装
先装服务器端
带空格的目录也要少用,如c盘的program files
端口号被占用
可以停止端口占用,但是使用虚拟机linux环境就不可以了
修改端口号
安装install
点击finish后需要重启再次加载注册表
此时我们可以去安装客户端,然后一起重启
稍等,看一下VisualSVN Server Manager
新建仓库
文件系统和数据库系统两个选项,我们选择第一个
选择仓管结构
设置授予权限
创建,复制地址
https://LAPTOP-M0D335QP:8443/svn/svnrepository
新建user
再来一个
再来一个
创建组
授权
给测试组只读权限
开发组读写
安装客户端
小乌龟~
完成,重启计算机
打开TortoiseSVN Repository Browser
输入上面复制的路径
新建
因为只有只读权限,所以不可以创建
点击ok结束
点击settings
清除认证数据
重新输入账号密码
新建test成功
拽进来一张图片
此时图和版本解析都过来了
checkout用于从服务器首次下载代码
commit用于提交本地代码
update用于把本地代码和服务器同步,用服务器代码更新本地
修改图片
图标左下角应该出现个红色叹号,但是我这个没显示。。。。
update,commit操作都有
点击commit,test文件夹中Revision由2变3
客户端主要为了操作文档,而不是代码。
装eclipse SVN插件
直接拷贝
验证
有了成功
显示SVN资源库视图
新建资源库位置
把之前复制的地址放进去
上传项目
注释可以不要,没多大用
视图切换
打开SVN资源库
此时在项目,文件夹,文件上右键commit都可以提交
添加注释
刷新一下
此时原视图下图标有了小变化
此时表示代码与服务器相同,当我们修改、保存后
导出checkout
默认
使用缺省空间
如果报了叹号,说明jdk、tomcat等有问题
提交修改代码
添加注释
提交修改变成了6
点击team的更新可以更新最新的代码
当两个人改了同一个文件的不同位置
后写的人会因为版本不是最新而阻止提交,但是这个时候更新自己写的代码不会丢失,当两个人改了不同文件,不会发生冲突
当两个人改了同一个文件的相同位置
后提交的人更新后会出现三个版本的内容,之前版本,自己版本,最新版本。
显示资源历史记录,以及和服务器断开连接
断开连接
将项目中的.svn也会删掉,选下面的会把磁盘文件也删掉
注意熟悉CRM项目的注解配置
- 新建db包放入crm.sql和联系人数据文件
- 新建com.itheima.domain创建实体类Customer.java实现序列化接口(成员变量private,get,set方法,toString方法)
- 除了spring整合struts包、struts-annotation包、struts基本jar包都可以考进去,因为可能会出错
- Customer.java添加注解
@Entity
@Table(name="cst_customer")
@Id
@Column(name="cust_id")
@GeneratedValue(strategy=GenerationType.IDENTITY) - 创建业务层接口ICustomerService.java
- 客户的业务层实现类CustomerServiceImpl.java
- ICustomerDao.java
- CustomerDaoImpl.java
- 在config包下新建applicationContext包(配置要扫描的包;
在Serviceimpl里添加注解@Service("customerService"),@Resource(name="customerDao"),在CustomerDaoImpl中添加注释@Repository("customerDao"),@Resurce(name="hibernateTemplate");
配置hibernateTemplate;
配置sessionFactory;
配置数据源) - 新建test包新建测试文件
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:config/applicationContext.xml"})
@AutoWired
@Test - 配置事务管理器
- 开启spring对注解事务的支持
- 在业务层需要使用事务的地方使用@Transactional注解
CustomerServiceImpl中@Transactional(readOnly=true,propagation=Propagation.SUPPORTS)
@Transactional(readOnly=false,propagation=Propagation.REQUIRED) - 放入各种界面
导入struts基本jar包
struts的注解jar包
spring整合jar包 - web.xml中配置struts2的核心过滤器
配置spring的监听器,保证一个应用只有一个容器
手动指定spring配置文件的位置 - 添加动作类CustomerAction
@Controller("customerAction")
@Scope("prototype")
@ParentPackage("struts-default")
@Namespace("/customer")
@Results({
@Result(name="addUI",type="dispather",location="/jsp/customer/add.jsp")
})
@Action("addUICustomer")