一键切换jdk版本

工作中有时候会切换jdk版本.有时候需要用个64位的.有时候需要用32位的.频繁手动很不方便,参考了一下,写了一个bat脚本,保存为bat,运行即可切换.同理可以改改,运来切换1.7,1.8这样的版本. @echo off :init set JAVA_HOME_32=D:\5.Program\Jdk32Home set JAVA_HOME_64=D:\Software\JdkHome :start echo. echo ============================================= echo jdk版本列表 echo 32 (%JAVA_HOME_32%) echo 64 (%JAVA_HOME_64%) echo ============================================= :select set /p opt=请选择jdk版本: if %opt%==32 ( start /I /WAIT /B wmic ENVIRONMENT where name='JAVA_HOME' set VariableValue="%JAVA_HOME_32%" >nul rem reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v JAVA_HOME /t reg_sz /d "%JAVA_HOME_32%" /f goto success ) if %opt%==64 ( start /I /WAIT /B wmic ENVIRONMENT where name='JAVA_HOME' set VariableValue="%JAVA_HOME_64%" >nul rem reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v JAVA_HOME /t reg_sz /d "%JAVA_HOME_64%" /f goto success ) echo 选择的版本错误,请重新选择! PAUSE goto start :success echo. echo 设置环境变了成功.

2014-11-07 · 1 min · bystander

jenkins相关资料

jenkins相关资料 jenkins的前身是hudson,是为了做持续集成测试而诞生的框架. 简单说就是把代码流配置上去,然后该框架就能根据设定的时间或其他方式不间断的执行测试用例.并给出报告.这样就可以随时掌控代码质量.支持执行shell命令.支持短信通知等等. jenkins,首先从http://jenkins-ci.org/官方下载war包,然后有两种方式可以本地部署,一种直接执行 java -jar hudson.war,然后在本地的8080端口访问就可以了.另一种是我们希望部署在容器上,那么可以部署到tomcat,jetty等等.直接拷贝war包到对应的目录即可. 部署成功后,可以新建job,然后配置svn流,配置build时间,配置一下build之前的动作,配置一下各种命令,执行完成后通知等等就可以了. 最近因为有个功能感觉通过开发jenkins插件的方式会更加方便,周末大量读了一些文档,能找到的都是helloworl.摸索了一下,已经写出一个小的demo了,后面改进一下,.就ok了.先简单把这个过程中收集的资料整理一下.基本都看过觉得还不错的,官方文档不给力.下周希望可以写完,然后分享出来. jenkins入门文档 The hudson book Writing-first-hudson-plugin Hudson插件开发简介 Hudson插件开发入门体验 插件界面设计设计的各种tag介绍 官方插件开发 UI开发jelly介绍 jenkins入门(itech)

2014-09-21 · 1 min · bystander

蓝绿发布的整个部署过程

一直听说蓝绿发布,不知道是怎么个过程. thanks to blue-green-deployment 蓝绿发布的意义 整个发布过程,用户没有感受到任何宕机或者服务重启。 蓝绿发布的过程 第0步:部署以前的配置 第1步: 把绿色集群的状态改为’备用’. 从负载均衡的池里把这些地址去掉,这样,绿色的集群就不再回接收到来自用户的请求了.转而进入备用负载均衡的池里. 第2步:在绿色集群里部署新的代码,直到应用启动成功 第3步:使用备用负载均衡简单测试一下备用集群的部署情况.理想状态下是全自动的. 第4步:把绿色备用集群的状态改成存货,于是进入了存活负载均衡的池里 看到 蓝色运行v1版本,绿色运行v2版本,都连接的是相同的数据库.这意味着v2版本也要在老的数据模型上运行.如果数据库有变更,要等到所有的集群升级到新的代码上. 第5步: 对蓝色集群也进行同样的操作. 最终v2代码完成部署. 第6步:根据情况.运行数据库迁移  

2014-09-14 · 1 min · bystander

第一次给Spring-Framework贡献代码

鲁肃说建议去看Spring框架的代码,之前其实我想看来着,不过一看到还要gradlew,换jdk就好麻烦.这次各种折腾把代码fork下来,然后安装gradlew ,然后转换成eclipse支持的,期间升级了eclipse版本和jdk版本到8.否则会有个方法不支持, 流程很简单,先fork一下代码,然后自己改好提交上去,再去Spring框架的pull request请求一下.等大牛合并就行了. 刚开始看测试用例,我当时看到这个方法调用了一个下线的方法.于是改了一下.提交上去之后,**sbrannen ** 回复说: while you’re at it, why don’t you go ahead fix the related deprecated issues in all of the test classes in spring-jdbc 于是我把spring-jbdc包下面的几个方法调用都改掉了.记得谁说过,任何事情都不是别人的事情,你发现了你就要去做,不要等着别人去做,不会就去学.于是再次修改提交,sbrannen 问我有没有签CLA,这个坑爹的网站挂了.等了几天,昨天终于ok了.今天代码已经合并. 截图留念: https://github.com/spring-projects/spring-framework/commits?author=leizhiyuan 今天要吃两个煎饼果子.

2014-08-21 · 1 min · bystander

Python学习资源

最近突然觉得需要学习一个轻便的语言,每次写个小工具啥的还要打开eclipse,很是不方便。于是学习了一下python,看看官方文档基本就可以上手了,剩下的就是多用了,个人用python写了个调用websevice的东西,suds这个库3.x已经不维护了,坑爹,需要使用http://pypi.python.org/pypi/suds-jurko 这个库代替,主要是为了批量测试mock的连通性的, 另外是python3.x和python2.x差异是在很大,我选了3…, 刚学习的人还是建议从2.x开始吧,否则很多源代码你下载回来基本运行不了。 本文是我在学习过程中看到的不错的文档,希望有所帮助。 先看官方文档,英文版觉得有难度看下中文版:Python3.4 入门指南 然后写写代码,小例子看看Python快速教程 遇到问题,可以去看看:stackoverflow python 百问 刚开始,你可能不知道module,package,这些都傻,先看看这篇文章python模块 如果你比较纳闷那个命名中的双下划线,但下划线都啥意思,看看单下划线和双下划线区别 之后,你可能想看看一个系统的组织,那么看看python最佳实践指南全版 如果你觉得上面的太多,看看中文的摘要版 后来我看到一个yield,不太明白,于是我看到了Python yield 使用浅析,只能说写的真是好,就是迭代器生成的 想看看正则?看看python正则表达式指南,非常全面 我只是想发个http请求,如果你用了python3.x,报错,Import error: No module name urllib,那么看看urllib这个坑,你可能要看看,你没有看错,他们合并了。。 Dive into Python 中文也看看,不要在意细节。 最后好像看看Expert Python Programming,因为我没看。

2014-07-26 · 1 min · bystander

Spring揭秘-23章,Spring MVC初体验

 鸟瞰Spring MVC与其他请求驱动的Web框架思路类似。org.springframework.web.servlet.DispatcherServlet就是Spring mvC中的Front Controller。负责处理请求,但是不针对具体的处理逻辑。而是委派给下一级的控制器,也就是org.springframework.web.servlet.mvc.Controller去执行。 DispatcherServlet的处理流程如下:1.HandlerMappingDispathcherServlet是FrontController,所以他服务于一组Web请求,需要在web.xml中配置。DispathcherServlet需要自己处理请求和处理之前的对应关系,比如根据参数对应到不同的Controller上。为了更加方便的处理映射的匹配,引入HandlerMapping用来获取需要处理请求的对应的Controller类。 2.Controller对应于DispathcherServlet的次级控制器,本身实现了对应某个具体Web请求的处理逻辑,当HandlerMapping查到了Controller之后,DispathcherServlet获得了HandlerMapping的返回结果。然后调用Controller处理请求,处理完成后,返回一个ModelAndView实例,里面包含两部分内容视图的逻辑名称,DispathcherServlet根据名称决定显示哪个视图模型数据,渲染过程中需要将这些模型数据并入视图的显示中 ViewResolver和View我们已经来到了最后一步,要转成最终的JSP视图文件。由于模板引擎很多,Spring提供了一套基于ViewResolver和View的抽象层。 ![](/images/fc45dedeba68b31c39383776fc7a7a35eba30a5a.jpg) [来自为知笔记(Wiz)](http://www.wiz.cn/i/e0140d75 "来自为知笔记(Wiz)")

2014-07-13 · 1 min · bystander

Spring揭秘-22章,迈向Spring MVC的旅程

Spring揭秘-22章,迈向Spring MVC的旅程 Servlet导致数据访问逻辑和业务处理逻辑和对应的视图渲染逻辑相互混杂。之后,JSP出现,通过将输出渲染以模板的形式抽取到jsp后缀的模板文件中,jsp开始繁盛,同时要注意,Servlet处理web请求的时候,要在web.xml中,注册相应的请求url和具体的Serlet的映射关系。于是,jsp有开始混合着写代码 于是,我们引入了JavaBean,来封装相关业务逻辑,经过一次升级后, ![](/images/e6af173baae0c480b8dddc398ce8dd3078b260e4.jpg) 这个模型就比较清楚了。但是和MVC还是有点差别一个典型的mvc模式应该是这样的![](/images/4bcce41a42b7cc021f4b726da1c3533cc5371a21.jpg) 控制器处理请求,模型封装逻辑和状态,视图给用户, Structs以请求/响应框架为基础。 Spring MVC属于请求渠道的WEb框架。框架引入Front Controller做分发之后,就更加好管理了。 ![](/images/131d593fd9a36cfc8180a4b86495208a356ae563.jpg) [来自为知笔记(Wiz)](http://www.wiz.cn/i/e0140d75 "来自为知笔记(Wiz)")

2014-07-13 · 1 min · bystander

Spring揭秘-第13章 统一的数据访问异常层次体系

Spring揭秘-第13章 统一的数据访问异常层次体系 DAO可以分离数据哭的访问和存储,屏蔽各种数据访问方式的差异性,下面以访问顾客信息为例,使用DAO模式 首先定义一个数据访问对象接口,如下 public interrface ICustomerDao{ Customer findCustomerByPK(String customerId); void updateCustomerStatus(Customer customer);   之后,所有的数据访问都通过该接口进行,不论底层存储机制如何改变,DAO的实现因此会扩展,但客户端代码不需要调整 客户端要用的时候这样使用即可。 publicclassCustomerService { privateICustomerDao customerDao; publicvoid disableCustomerCampain(String customerId) { Customer customer=getCustomerDao().findCustomerByPK(customerId); customer.setCampainStatus(CampainStatus.DISABLE); getCustomerDao().updateCustomerStatus(customer); } publicICustomerDao getCustomerDao() { return customerDao; } publicvoid setCustomerDao(ICustomerDao customerDao) { this.customerDao=customerDao; }   我们只要针对不同的数据存储方式实现不同的Dao类即可。 我们开始实现具体的访问数据了。 publicCustomer findCustomerByPK(String customerId) { Connection con=null; try{ con=getDataSource().getConnection(); Customer cust=..; return cust; } catch(SQLException e){ //这里咋办,直接抛出还是直接处理? } finally{ releaseConnection(con); } } privatevoid releaseConnection(Connection con){ }   SQLException 是checked exception,如果在DAO的实现类里直接处理掉,那么客户端怎么知道发生了问题, 于是,只能处理,那么客户端的签名就要改了 <span class="typ">Customer</span><span class="pln"> findCustomerByPK</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> customerId</span><span class="pun">)</span><span class="kwd">throws</span><span class="typ">SQLExcepiton</span><span class="pun">;</span> ICustomerDao也要改了,可是这样的话 如果数据在其他方式存储,那么其他类型的异常捕获就要继续添加到方法签名。由于数据访问机制的不同,导致这个接口签名不断在变化。 那怎么办呢?DAO如此美好的远景。 直接抛出,的话,因此,可以根据发生的异常信息封装成不同的unchecked exception,然后抛出,这样方法签名不用改。因为unchecked不需要编译器检查。 要开始写了?Spring的数据访问异常层次体系已经给我们做完了 该体系下面所有的异常类型均以DataAccessException为统领,然后划分成不同的子类型 ![](/images/3ab324530a8c3d0b0216d3f7549ebbfa6b7869f4.jpg) 这些类是啥搜索一下,或者根据名字猜一下,之后我们就可以

2014-07-13 · 1 min · bystander

Spring揭秘-第四章BeanFactory笔记

之前说了,IoC容器就是一个IoC Service Provider,但是容器是个啥意思?![](/images/d4d1615a6c1a06895088631c37e3fca7692f0b8a.png) 可以看到IoC容器提供了更多的内容, Spring的IoC容器又分成两种, 1.BeanFactory 。基础类型IoC容器,提供完整的IoC服务支持。如果没有特殊指定,默认采用延 迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管对象的时候,才对 该受管对象进行初始化以及依赖注入操作。所以,相对来说,容器启动初期速度较快,所需 要的资源有限。对于资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的 IoC容器选择。 2.ApplicationContext。ApplicationContext在BeanFactory的基础上构建,是相对比较高 级的容器实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布、国际化信息支持等,这些会在后面详述。ApplicationContext所管理 的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以,相对于BeanFactory来 说,ApplicationContext要求更多的系统资源,同时,因为在启动时就完成所有初始化,容 器启动时间较之BeanFactory也会长一些。在那些系统资源充足,并且要求更多功能的场景中, ApplicationContext类型的容器是比较合适的选择。 通过 图4-2,我们可以对BeanFactory和ApplicationContext之间的关系有一个更清晰的认识。 ![](/images/f531ea3e11bb391453eb5f763283398c938634b2.png) Bean工长,就是生成Bean的嘛,每个业务对象被看成Javabean,我们与工厂打交道就简单得多,我们只要告诉他我要什么对象,至于怎么组装,那是他的事情。 工厂提供了一些对外的接口,比如获取Bean,渠道Bean的状态等等。 以xml为例 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="djNewsProvider" class="..FXNewsProvider"> <constructor-arg index="0"> <ref bean="djNewsListener"/> </constructor-arg> <constructor-arg index="1"> <ref bean="djNewsPersister"/> </constructor-arg> </bean> <bean id="djNewsListener" class="..impl.DowJonesNewsListener"> </bean> <bean id="djNewsPersister" class="..impl.DowJonesNewsPersister"> </bean> </beans> 然后 public static void main(String[] args) { DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory(); BeanFactory container = (BeanFactory)bindViaXMLFile(beanRegistry); FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("djNewsProvider"); newsProvider.getAndPersistNews(); } public static BeanFactory bindViaXMLFile(BeanDefinitionRegistry registry) { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(registry); reader.loadBeanDefinitions("classpath:../news-config.xml"); return (BeanFactory)registry; // 或者直接 //return new XmlBeanFactory(new ClassPathResource("../news-config.xml")); } 人生好像就美好

2014-07-13 · 1 min · bystander

Spring揭秘-第三章IoC Service Provider读书笔记

我们虽然已经通过IoC声明了相应的依赖,但是最终总要有个啥东西将这些依赖对象绑定在一起,这里而IoC Service Provider, 来啦,表示一种绑定的实现方式,可以使一段代码,也可以是一组相关的泪,甚至是框架或容器。 比如前一篇提到的 IFXNewsListener newsListener = new DowJonesNewsListener(); IFXNewsPersister newsPersister = new DowJonesNewsPersister(); FXNewsProvider newsProvider = new FXNewsProvider(newsListener,newsPersister); newsProvider.getAndPersistNews();   就是一个容器,只不过太简单了,不适用于更多的场景, IoC容器就是Spring提供依赖注入服务的Provider IoC Service Provider 是干嘛? 1.业务对象的构建管理,剥离客户端对象的构建的依赖逻辑,比如A引用B,那么A是B的客户端对象,容器需要理清这种关系。 2.业务对象之间的依赖绑定,通过1的实现, 识别各个对象的依赖关系,然后将这些对象依赖的对象注入绑定,用的时候就有了。 那你要问了,这怎么管理对象间的依赖关系呢 IoC Service Provider怎么就能完全领会代码的意图呢?他怎么记住这么多的依赖关系等等,他要这么做 1.元数据方式 2.通过描述性较强的xml来记录对应信息 3.通过编写代码的方式注册这些信息 3.直接编码方式, 明确了依赖关系 IoContainer container = ...; container.register(FXNewsProvider.class,new FXNewsProvider()); container.register(IFXNewsListener.class,new DowJonesNewsListener()); ... FXNewsProvider newsProvider = (FXNewsProvider)container.get(FXNewsProvider.class); newProvider.getAndPersistNews();   2.配置文件方式 最常见的还是xml方式, <bean id="newsProvider" class="..FXNewsProvider"> <property name="newsListener"> <ref bean="djNewsListener"/> </property> <property name="newPersistener"> <ref bean="djNewsPersister"/> </property> </bean> <bean id="djNewsListener" class="..impl.DowJonesNewsListener"> </bean> <bean id="djNewsPersister" class="..impl.DowJonesNewsPersister"> </bean> 然后我们要用的时候 container.readConfigurationFiles(...); FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("newsProvider"); newsProvider.getAndPersistNews(); 容器读取配置文件,然后取到其中的两个类,注入进来。 1.元数据方式 代表实现Java Guide,基于java注解,在类中直接使用元数据信息来标注 各个对象之间的依赖关系。然后框架根据信息组装之后交给客户端对象使用 这种方式重写我们的例子就是 public class FXNewsProvider { private IFXNewsListener newsListener; private IFXNewsPersister newPersistener; @Inject public FXNewsProvider(IFXNewsListener listener,IFXNewsPersister persister) { this.newsListener = listener; this.newPersistener = persister; } ... } 通过 @Inject,我们指明需要IoC Service Provider通过构造方法注入方 余下的部分由Guide提供的Module完成,我们继承一下。 public class NewsBindingModule extends AbstractModule { @Override protected void configure() { bind(IFXNewsListener.class) .to(DowJonesNewsListener.class).in(Scopes.SINGLETON); bind(IFXNewsPersister.class).to(DowJonesNewsPersister.class).in(Scopes.SINGLETON); } } 最后,要用的时候,直接来拿吧。 Injector injector = Guice.createInjector(new NewsBindingModule()); FXNewsProvider newsProvider = injector.getInstance(FXNewsProvider.class); newsProvider.getAndPersistNews();  

2014-07-13 · 1 min · bystander