通过本地SVN获得未提交的文件列表获取工程中最新的class的方式参考:

增量部署代码利用批处理命令按原始结构复制指定的文件

新写了一个增强版,根据已提交至SVN的代码loglist,获取最新的class方式,同时也支持根据本地未提交列表进行导出。

目的是解决开发过程中的以下问题:

1.在开发过程中,由于部分功能或者流程限制部分代码迟迟不能提交至生产环境,但是已经在本地积攒了很久,每次都要和其他开发同事人肉合并代码。

2.代码老是放在本地,会导致积攒的测试通过和开发中的代码混合的越来越多。

3.以前是以保证SVN代码与生产环境的代码保持同步,作为基线处理,新的方式只需要在上次部署的时间version打上标记即可。

解决思路:

1.建立一个独立的工程,工程源码以SVN中最新的文件,不包含任何本地开发的代码。

2.项目中需要标准的class等,直接使用mklink的方式创建目录链接,避免需要复制标准的class.

3.将源文件的路径中的java字符串替换为class,路径替换为class对应目录

4.执行复制。

5.检查是否完整复制。

优点:

1.适合于测试通过即可提交SVN,不用将大量代码攒到本地开发目录。

2.适合团队协作,当多人都在修改某个文件时,不再需要层层对比合并。

3.此方法不限于OAF项目,我个人觉得适合所有的需要增量部署的项目,包括其他的java项目。

1.建立新工程

new project ->Business Components Project

2.引入SVN代码

设置MDS XML Path

3.bl_prod目录下建立标准class及依赖源码的link目录链接,命令如下

mklink /D C:\JDeveloper\jdevhome\jdev\myprojects\bl_prod\classes\oracle C:\JDeveloper\jdevhome\jdev\myclasses\oracle
mklink /D C:\JDeveloper\jdevhome\jdev\myprojects\bl_prod\src\oracle\ C:\JDeveloper\jdevhome\jdev\myprojects\oracle\

如下:

至此,需要准备的工程结构已就绪。

4.准备需要的objectlists.

SVN:show log->选中需要的文件->右键 copy to clipboard->Paths relative to root.

粘贴至objectslist。

注意复制出来的SVN路径为 / 目录结构。

使用过程中xcpfile.bat中有三个目录需要根据自己的使用做调整

此脚本在xcpfile中加入了严格校验所有文件的编译日期是否为当前日期的功能,根据需要进行注释,目的是防止忘记更新及编译。

rem 严格校验编译时间是否为今天,根据需求选择是否需要注释掉此逻辑
rem 建议使用独立的SVN最新文件的工程
call:checkfilebuildtime !classpath!

文件下载:xcpfile_v1.0.zip

使用方法:解压,更改xcpfile.bat中的tarrootpath,rootpath,sourcerootpath变量。

执行,通过CMD命令行进入到xcpfile所在的目录,执行xcpfile.bat即可。会自动复制文件,并检查完整性。最后复制的目标目录会输出到屏幕。

xcpfile.bat,以ANSI编码格式保存

@echo off&setlocal enabledelayedexpansion 

REM AUTHOR:黄洪波
REM DATE:
REM Version:1.0
REM 根据自己的环境设置目标根目录和classes长度
rem Update log
rem v1. 使用 xcopy命令 /exclude:exclude.cfg 来排除指定文件
rem v1. 使用 >nul 去掉xcopy,dir命令在屏幕上提示运行结果
rem v1. 本版本将原有的xcpfile和checkfilecount失效了,objectslist.cfg文件来源为SVN log中的路径,见rootpath,sourcerootpath
rem v1. SVN showlog中选择部署文件时需注意,遇到list为目录的情况,此脚本会直接复制完整的目录下的文件,请注意遴选
rem v1. 选择SVN LOG LIST文件时,不要直接选择所有,否则delete掉的文件不存在会导致复制失败
rem v1. 通过正确的设置rootpath,sourcerootpath,此脚本能同时满足objlist为服务器路径和本地路径的情况
rem v1. 加入检查所有被复制的文件的编译日期为今天,防止漏编译的情况
rem v1. 加入源class文件是否存在的判断,不存在则中止执行,旧版本会继续往下执行,由xcopy命令会给出提示找不到文件
rem v1. 此种情况多半是SVN中的更改类型为delete,但是没有在objectslist中排除该文件导致,检查objectslist
rem v1. 忽略objectslist.cfg中以#开头的行
rem v1. rootpath不再需要将/替换为\,直接取objectslist中的根目录string即可。 REM 使用方法,在copy.bat同级目录下建立文件objectslist.cfg,将需要部署的文件的源文件(java,xml)按行放入cfg文件中
REM 本方法默认cfg中为文件列表,未处理文件夹的情况
REM 配合SVN使用,效果极好,SVN COMMIT,右键选择需要部署的文件,COPY FULL PATHS
REM 执行cpfile.bat命令
REM 使用xcopy配合参数来达到递归拷贝文件夹的目的
REM 需要排除的文件放入exclude.cfg中 REM 获取当前日期 YYYYMMDD
set datestr=%date:~,%%date:~,%%date:~,%
rem echo !datestr! REM 替换为自己想要的目标路径
set tarrootpath=C:\Work\项目\CUX项目\DEV部署\!datestr!\install\ rem 设置目标根目录
set tarpath=!tarrootpath!code\oaf\ REM 根据自己的C:\JDeveloper\jdevhome\jdev\myclasses\,myclasses目录的路径长度进行设置
rem set sourcerootpath=C:\JDeveloper\jdevhome\jdev\myclasses\ rem 根据SVN目录处理源路径和目标路径
rem 支持windows目录列表\形式以及linux目录/形式 rem 本地目录列表获取方式,开发目录,右键SVN Commit,选择需要的文件,右键copy to clipboard,full path
rem set rootpath=C:\JDeveloper\jdevhome\jdev\myprojects\
rem set sourcerootpath=C:\JDeveloper\jdevhome\jdev\myclasses\ rem SVN最新工程目录,右键SVN LOG,选择需要的文件,Copy to clipboard, path relative to root
set rootpath=/TECH_EBS/OAF_CODE/
set sourcerootpath=C:\JDeveloper\jdevhome\jdev\myprojects\bl_prod\classes\ REM 全局变量
set len=
set splitstr= set filecount=
set copycount= rem 将被排除的文件名称组成字符串,findstr加入""则是判断字符串,不加则是通过文件进行判断
set execludestr="
for /f "eol=# tokens=*" %%i in (exclude.cfg) do (
set str=%%i
rem echo str !str!
set execludestr=!execludestr! !str!
)
set execludestr=!execludestr!"
rem echo execludestr !execludestr! call:length !sourcerootpath!
rem 获取sourcerootpath的长度
rem 设置lgth为数字型
set /a lgth=!len!
rem echo lgth !lgth! rem 判断目标根目录是否存在
if not exist !tarpath! (
md !tarpath!
) rem xcopy命令会自动创建目录
call xcopy /Y /Q /S install.cfg !tarrootpath! >nul
call xcopy /Y /Q /S install.pl !tarrootpath! >nul echo 正在复制...
call:xcpfile
echo 执行检查...
rem 检查数量
call:checkfilecount goto:eof rem 此方法为最新根据SVN路径获取到的文件路径进行复制
:xcpfile
set rootpathtemp=!rootpath:/=\!
for /f "eol=# tokens=*" %%i in (objectslist.cfg) do (
set str=%%i
rem echo str !str!
rem 替换行文本中的myprojects为myclasses
set temp=!str:/=\!
rem echo temp !temp!
rem 替换行文本中的java为class
set temp1=!temp:java=class!
rem 设置class及xml文件完整文件路径
set classpath=!temp1:%rootpathtemp%=%sourcerootpath%!
rem echo classpath !classpath! rem 得到classpath的长度
call:length !classpath!
rem classpath的完整长度赋值给length1
set length1=!len!
rem echo length1 is !length1! rem 获取以\拆分classpath,获取最后一个"\"字符之后的内容
call:splitstring !classpath!
rem echo splitstr is !splitstr! rem 获取classpath中\后的字符长度
call:length !splitstr!
rem 将其赋值给length2
set length2=!len!
rem echo length2 is !length2! rem 判断是否存在
if not exist !classpath! (
echo 该文件或文件夹!classpath!不存在,请检查文件或者objectslist.cfg
rem 检查该文件或目录是否存在(使用此命令不能再使用向上回滚出最近运行的命令)
cmd /k
) rem 严格校验编译时间是否为今天,根据需求选择是否需要注释掉此逻辑
rem 建议使用独立的SVN最新文件的工程
rem 检查到编译时间错误,中止当前脚本运行
call:checkfilebuildtime !classpath! rem 判断是否为目录
if exist !classpath!\ (
rem echo !classpath! is dir
rem echo lgth is !lgth!
rem 获取类路径
call set clapth=%%classpath:~!lgth!%%
rem echo clapth dir !clapth!
) else (
rem 判断文件的编译是否为今天
rem echo !classpath! is file
rem 做减法运算
rem 此处的需要根据本地的路径长度做调整
set /a leng=!length1!-!length2!-!lgth!
rem echo leng !leng!
rem 获取类路径
call set clapth=%%classpath:~!lgth!,!leng!%%
rem echo clapth !clapth!
) set targetpath=!tarpath!!clapth!
rem echo targetpath !targetpath! rem 判断目标根目录是否存在
if not exist !targetpath! (
md !targetpath!
rem copy !classpath! !targetpath!
REM /S 不复制空目录
call xcopy /Y /Q /S /exclude:exclude.cfg !classpath! !targetpath! >nul
rem set /a copycount=!copycount!+
) else (
rem 复制文件
rem copy !classpath! !targetpath!
xcopy /Y /Q /S /exclude:exclude.cfg !classpath! !targetpath! >nul
rem set /a copycount=!copycount!+
) )
goto:eof rem 获取字符串长度
:length
set "str=%~1"
for /l %%i in (,,) do if "!str:~%%i,1!"=="" set strlen=%%i && goto :end
:end
rem echo 字符串长度为 %strlen%
set len=%strlen%
rem echo 长度为 %len%
goto:eof rem 按\拆分字符串
:splitstring
set string=%~
set split=
:split
for /f "tokens=1,* delims=\" %%i in ("%string%") do (
rem echo %%i
set string=%%j
set split=%%i
)
if not "%string%"=="" goto split
rem echo split !split!
set splitstr=%split%
goto:eof rem 检查被复制的文件的编译日期是否为今天
rem 防止忘记编译的情况
:checkfilebuildtime
rem for /f %%a in ('dir /a-d/b/tw exclude.cfg') do set tw=%%~ta
rem echo %tw% rem for %%i in (exclude.cfg) do (
rem echo %%~ti
rem set updatetime=%%~ti
rem )
rem echo updatetime !updatetime!
rem set updatestr=%updatetime:~,%%updatetime:~,%%updatetime:~,%
rem echo updatestr !updatestr! set str=%~
rem echo str !str!
rem str路径为目录
if exist !str!\ (
rem 列出str目录下所有的文件,并判断编译日期
for /f "delims=" %%b in ('dir !str! /b/s/a-d 2^>nul ^| findstr /v !execludestr! ' ) do (
set filestr=%%b
rem echo !filestr!
call:checkfilebuildtime !filestr!
)
) else (
for %%i in (%str%) do (
rem echo %%~ti
set updatetime=%%~ti
)
rem echo updatetime !updatetime!
set updatestr=!updatetime:~,!!updatetime:~,!!updatetime:~,!
rem echo updatestr !updatestr!
if !updatestr! NEQ !datestr! (
rem echo errorstr !errorstr!
echo 该文件!str!的编译日期为!updatestr!不是今天,请检查!
rem 检查到错误,暂停运行,但是按任意键后仍然会继续执行
rem pause >nul
rem 检查到编译时间错误,中止当前脚本运行(使用此命令不能再使用向上回滚出最近运行的命令)
cmd /k
)
)
goto:eof rem 检查文件数量
:checkfilecount
set rootpathtemp=!rootpath:/=\!
set notexistscount=
set errorstr= for /f "eol=# tokens=*" %%i in (objectslist.cfg) do ( set str=%%i
rem echo str !str!
rem 替换行文本中的myprojects为myclasses
set temp=!str:/=\!
rem echo temp !temp!
rem 替换行文本中的java为class
set temp1=!temp:java=class!
rem 设置class及xml文件完整文件路径
set sourcepath=!temp1:%rootpathtemp%=%sourcerootpath%!
rem echo classpath !classpath! call set clapth=%%sourcepath:~!lgth!%%
set targetpath=!tarpath!!clapth! rem echo sourcepath !sourcepath! targetpath !targetpath! rem 源路径为文件夹
if exist !sourcepath!\ (
set sourcecount=
rem 加入2^>nul解决目标文件夹中没有文件时,屏幕显示找不到文件的问题
rem 列出sourcepath下所有的文件且排除execludestr
for /f "delims=" %%b in ('dir !sourcepath! /b/s/a-d 2^>nul ^| findstr /v !execludestr! ' ) do (
set /a sourcecount+=
) rem echo sourcepath !sourcepath! sourcecount !sourcecount! set targetcount=
rem 加入2^>nul解决目标文件夹中没有文件时,屏幕显示找不到文件的问题
for /f "delims=" %%b in ('dir !targetpath! /b/s/a-d 2^>nul ^| findstr /v !execludestr! ' ) do (
set /a targetcount+=
)
rem echo targetpath !targetpath! targetcount !targetcount! if !sourcecount! NEQ !targetcount! (
rem echo errorstr !errorstr!
set errorstr=!errorstr! !sourcepath!中有文件复制失败
)
) else (
rem echo file targetpath !targetpath!
if not exist !targetpath! (
rem echo errorstr !errorstr!
set errorstr=!errorstr! !sourcepath!复制失败
)
) ) if "%errorstr%" =="" (
echo 经检查,已完整复制objectslist中的文件至 !tarpath! 。 ) else (
for %%i in (!errorstr!) do echo %%i
) goto:eof

exclude.cfg

bc4j.xcfg
server.xml
.zip

objectslist.cfg

/TECH_EBS/OAF_CODE/cux/oracle/apps/pos/test/server/CuxTestAM.xml
/TECH_EBS/OAF_CODE/cux/oracle/apps/pos/test/server/CuxTestAMImpl.java
/TECH_EBS/OAF_CODE/cux/oracle/apps/pos/test/server/CuxTestVO.xml
/TECH_EBS/OAF_CODE/cux/oracle/apps/pos/test/server/CuxTestVOImpl.java
/TECH_EBS/OAF_CODE/cux/oracle/apps/pos/test/webui/CuxTestPG.xml
/TECH_EBS/OAF_CODE/cux/oracle/apps/pos/test/webui/CuxTestCO.java

通过SVN获取变更列表,得到对应的最新class的更多相关文章

  1. hibernate 4.3 在使用获取数据获取不到数据库中最新变更的数据问题解决

    hibernate 4.3 在使用获取数据获取不到数据库中最新变更的数据问题解决,应该是因为缓存问题 问题过程和现象: 查询一个数据列表=>数据库中手动update了数据=>刷新页面,数据 ...

  2. SQL Server获取月度列表

    -- 获取月度列表 if exists(select 1 from sysobjects where name = 'proc_GetDateMonthList' and type = 'p') dr ...

  3. python 获取一个列表有多少连续列表

    python 获取一个列表有多少连续列表 例如 有列表 [1,2,3] 那么连续列表就是 [1,2],[2,3],[1,2,3] 程序实现如下: 运行结果:

  4. XMPP框架下微信项目总结(5)花名册获取(好友列表)

    ---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...

  5. 一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)

    × 本篇主要是: 获取好友列表,群列表 我会尽量详细一点,尽我所知的分享一些可能大家已经掌握的或者还不清楚的经验 利于大家阅读,文章样式不再复杂化,根据内容取固定色 目前总进度大概65% 全系列预计会 ...

  6. 转:ecshop商品分类页获取相册列表方法

    ecshop商品分类页获取相册列表方法 很久之前就看到过你好在商品列表页有获取到相册列表,但是一直没有实践过,感觉应该挺简单的吧,但是最近手上的项目刚好就需要这个功能,然后就想到网上查下资料,至少找个 ...

  7. C# 获取打印机列表以及串口

    C# 获取打印机列表以及默认打印机.串口列表. /// <summary> /// 获取本地已安装的打印机 /// </summary> /// <returns> ...

  8. C#WPF做FTP上传下载获取文件列表

    Xaml.cs: using Microsoft.Win32;using System;using System.Collections.Generic;using System.IO;using S ...

  9. 解决使用IIS5.0配置的FTP服务器,客户端浏览器访问时无法获取目录列表的问题。

    我在windows xp sp3下利用iis构架了FTP服务器,允许且只允许匿名用户登陆.但刚开始配置好后,不管是使用命令行模式还是使用浏览器都发现无法访问. 于是怀疑防火墙屏蔽端口所致,果不其然,在 ...

随机推荐

  1. ab命令压力测试

    网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_lo ...

  2. mysql hang and srv_error_monitor_thread using 100% cpu(已解决)

    昨天晚上,运维过来说有台生产服务器的mysql cpu一直100%,新的客户端登录不了,但是已经在运行的应用都正常可用. 登录服务器后,top -H看了下,其中一个线程的cpu 一直100%,其他的几 ...

  3. Node-webkit 安装使用npm安装模块方法

    原文链接:http://jingyan.baidu.com/article/5225f26b5aaa20e6fa0908a6.html package.json可以放在软件根目录下,也可以放在项目目录 ...

  4. QT中VideoProbe的简介和实现

    一.遇到问题        在Android机上使用QT进行图像处理程序设计的时候,遇到的一个比较明显的问题就是图片采集的问题----摄像头获得是实时的视频,如果我们想从中动态地截获图片,并且转换成M ...

  5. 基于Android的闹钟的软件

    一.本课题要求:设计一个基于Android的闹钟的软件. 实现的功能有:能通过界面设置闹钟的启动条件建立后台服务进程,当满足触发条件时,闹钟响应相应事件. 二.需求分析 该课题实现在手机操作系统And ...

  6. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

  7. 2017 ACM/ICPC 新疆赛区 I 题 A Possible Tree 带权并查集

    传送门 题意:给定一棵带权树的形态, 但是并不知道每天条边的具体权重. 然后给m个信息, 信息格式为u v val, 表示在树上u 到 v 的路径上经过的边的权重的异或和为val, 问前面最多有多少个 ...

  8. BZOJ4415: [Shoi2013]发牌 树状数组+二分

    Description 假设一开始,荷官拿出了一副新牌,这副牌有N张不同的牌,编号依次为1到N.由于是新牌,所以牌是按照顺序排好的,从牌库顶开始,依次为1, 2,……直到N,N号牌在牌库底.为了发完所 ...

  9. python如何安装第三方库

    1.python集成开发环境pycharm如何安装第三方库 http://blog.csdn.net/qiannianguji01/article/details/50397046 有的时候安装不上第 ...

  10. Codeforces Round #223 (Div. 2) E. Sereja and Brackets 线段树区间合并

    题目链接:http://codeforces.com/contest/381/problem/E  E. Sereja and Brackets time limit per test 1 secon ...