java生产环境增量发版陷阱【原】
前言
在生产环境,我们为了降低发版风险,一般都只做增量发布,不做全量发布.
除非项目只有一到两人开发,对时间线和代码脉络结构一清二楚,才可全量发布.
然而增量发布也是有一定隐藏陷阱在里面的,以下就是笔者的项目组在增量迭代过程中一起遇上到陷阱
陷阱1 : 匿名内部类
如果修改的java源码中,有匿名内部类,那么最终在WEB-INF/classes/.......package....../Person.java 下面会生Person$XXX.class的匿名内部类,
但是我们在提交svn时,一般不涉及classes/下面的class文件的提交.
于是带来的问题是svn仅仅发现变更了源文件Person.java ,等到通过svn的记录都增量打jar包提交生产环境的时候. 经常会把Person$XXX.class匿名内部类给遗漏了.
导致上生产一般会报"类找不到"的异常.
解决方法: 参考我的另一篇文章 windows cmd命令 批处理bat 导增量jar包【原】
陷阱2 : 方法重载
和前一个问题有点相似,但不完全一样.
假如有以下两个java文件.
Test.java
package test;
import test.Person; public class Test {
public static void main(String[] args) {
Person person = new Person();
person.setId(18);
person.setName("bobo");
System.out.println(person.getId());
}
}
Person.java
package test;
public class Person {
int id = 0;
String name = "";
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
现在把eclipse里面的Person.java的 id 属性从int 改成 Integer
package test;
public class Person {
Integer id = 0;
String name = "";
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
那么从源码Test.java的角度出发来讲,肉眼是看不出变化, 没错,源码还是源码. svn也不会发现变化.
但是! 其实 setId(int id) 和setId(Integer id) 这根本不是同一个方法, 这叫方法重载,在Person.java中本来就是可以并存的, 然而这个方法重载很特别, 因为int 和 Integer 是基本类型和对象类型互通的, 所以调用setId(18) 不管是用setId(int id) 还是 setId(Integer id)都可以 , 于是eclipse也不会报错, 其java文件还真是不需要修改的, 这就演变了成一个隐藏的陷阱, class早就发生变化了(eclipse 自动编译).
虽然java源码没变化,但所有调用到 Person对象的setId(Integer id)方法的class全发生变化了.所以这个时候增量发包的时候可能会很严重了,发生产后,隐藏的class(比如Test.class) 全没提交, 报一堆的java.lang.NoSuchMethodError异常. 这是笔者对Person变化前后用bccompare工具对Test.class文件作的二进制对比

于此同时double 和 Double , float 和 Float 也都要特别小心方法重载时的其它调用类的底层class是否有变化.
解决方案: 无 ! 只能向项目组强调 以 防患于未然 , 或者用 jenkin 等完善的自动化工具做全量发布。
java生产环境增量发版陷阱【原】的更多相关文章
- Java生产环境下性能监控与调优详解视频教程 百度云 网盘
集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...
- 在 Ubuntu 13.10 中搭建Java开发环境 - 懒人版
本文记录我在Ubuntu 13.10中搭建Java开发环境. 本文环境: Ubuntu 13.10 x64运行在Win7下的VMware Workstation 10中. 1. 安装JDK与JRE s ...
- Java生产环境JVM设置成固定堆大小深层原理
可能很多人都知道Java程序上生产后,运维人员都会设定好JVM的堆大小,而且还是把最大最小设置成一样的值.那究竟是为什么呢?一般而言,Java程序如果你不显示设定该值得话,会自动进行初始化设定. -X ...
- Java生产环境下性能监控与调优详解
1:JVM字节码指令与 javapjavap <options> <classes>cd monitor_tuning/target/classes/org/alanhou/m ...
- Java设置环境变量
客上转过来的. 非常多人写了非常久java代码.还不知道环境变量是怎么一回事.科普一下. 一.java设置环境变量 - 精简版 1.右键打开我的电脑->属性->高级->环境变量 ...
- Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)
之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...
- 配置算法(第4版)的Java编译环境
1. 下载 1.1 JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html选择“Windows x64 180.5 ...
- 【原】Storm Local模式和生产环境中Topology运行配置
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...
- [原]生产环境下的nginx.conf配置文件(多虚拟主机)
[原]生产环境下的nginx.conf配置文件(多虚拟主机) 2013-12-27阅读110 评论0 我的生产环境下的nginx.conf配置文件,做了虚拟主机设置的,大家可以根据需求更改,下载即可在 ...
随机推荐
- [HDU5536] Chip Factory
传送门:>Here< 题意:给出一个长度为N的序列,求$Max\{ (a_i + a_j) ⊕ a_k \}$ (i,j,k均不相同) ($N \leq 1000$) 解题思路 既然$O ...
- Matplotlib学习---用wordcloud画词云(Word Cloud)
画词云首先需要安装wordcloud(生成词云)和jieba(中文分词). 先来说说wordcloud的安装吧,真是一波三折.首先用pip install wordcloud出现错误,说需要安装Vis ...
- 二叉搜索树(BST)详解
前言:平衡树的前置知识吧 二叉搜索树的定义: 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值: (2)若右子树不空,则右子 ...
- python学习日记(python2/3区别补充,is / id/ encode str,bytes)
python2和python3区别 print python2中,print 是语句 :用法 ---->print '***' python3中,print 是函数:用法----->pri ...
- 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)
洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...
- P3613 睡觉困难综合征(LCT + 位运算)
题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
- 「NOI2014」购票 解题报告
「NOI2014」购票 写完了后发现写的做法是假的...然后居然过了,然后就懒得管正解了. 发现需要维护凸包,动态加点,询问区间,强制在线 可以二进制分组搞,然后你发现在树上需要资瓷撤回,然后暴力撤回 ...
- push的时候报错:Permission denied (publickey)
最近,在push的时候遇到一个问题,简单描述下过程(git客户端命令行操作) 我先在本地建了一个文件夹,mkdir dubbodemo 然后进入到这个文件夹,cd dubbodemo 添加我的内容 初 ...
- Shiro中的Remember me设置
1. 在Spring的相关配置文件中加入如下Remember me管理器配置: <!-- rememberMe管理器 --> <bean id="rememberMeMan ...