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配置文件,做了虚拟主机设置的,大家可以根据需求更改,下载即可在 ...
随机推荐
- Marriage Match II HDU - 3081(二分权值建边)
题意: 有编号为1~n的女生和1~n的男生配对 首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 然后输入f组,c,d表示编号为c的女生和编号为d的女生是朋友 进行配对的要求满足其一即 ...
- 解决Altera家的ROM仿真数据一直为0
BUG现象 各种配置都正确,但ROM就是不出数据,输出一直为零. 解决方式 对于rom的仿真,要更改生成的rom文件的一个地方,主要是由于相对路径与绝对路径的问题. 所以最简单的解决方法是把mif文件 ...
- MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方案
下载 VC redist packages for x64,下载完成,点击运行即可.
- Android studio preview界面无法预览,报错render problem
1.查看报错信息,如果有报错,该叹号应为红色,点击查看报错,显示为render problem 2.打开res/styles.xml修改为如图,添加Base. 3.再打开preview界面
- Hdoj 2199.Can you solve this equation? 题解
Problem Description Now,given the equation 8x^4 + 7x^3 + 2x^2 + 3x + 6 == Y,can you find its solutio ...
- 2018-2019 ACM-ICPC Pacific Northwest Regional Contest C Contest Setting(DP)
比赛链接:Contest Setting C题 题意:$n$道题目,每道题目难度为$ai$,选择$k$道难度不同的题目,有多少种选择方案.$1<=k<=n<=1000,1<=a ...
- cf366C Dima and Salad (dp)
是一个01分数规划的形式,只不过已经帮你二分好了. 把b乘过去,再减回来,找和等于0的a的最大值就行了 #include<bits/stdc++.h> #define pa pair< ...
- Python3 与 C# 扩展之~基础衍生
本文适应人群:C# or Python3 基础巩固 代码裤子: https://github.com/lotapp/BaseCode 在线编程: https://mybinder.org/v2/g ...
- servlet 会话技术
一.控制器: 1.如何去确定需要一个新的控制器? 原则:一类事务请求需要一个控制器. 二.会话: 用户开一个浏览器,访问一个网站,只要该浏览器不关闭浏览器,不管该用户点击了多少个超链接,访问了多少个资 ...
- ie烦人的bug篇
好多公司都不支持ie6了,基本都是ie8+,就连jq新版本也宣布放弃低版本ie,就不用说那些框架了,不过想用兼容ie的angularjs可以用我司徒大神写的avalon,个人感觉avalon也是比较好 ...