前言

在生产环境,我们为了降低发版风险,一般都只做增量发布,不做全量发布.

除非项目只有一到两人开发,对时间线和代码脉络结构一清二楚,才可全量发布.

然而增量发布也是有一定隐藏陷阱在里面的,以下就是笔者的项目组在增量迭代过程中一起遇上到陷阱

陷阱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生产环境增量发版陷阱【原】的更多相关文章

  1. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

  2. 在 Ubuntu 13.10 中搭建Java开发环境 - 懒人版

    本文记录我在Ubuntu 13.10中搭建Java开发环境. 本文环境: Ubuntu 13.10 x64运行在Win7下的VMware Workstation 10中. 1. 安装JDK与JRE s ...

  3. Java生产环境JVM设置成固定堆大小深层原理

    可能很多人都知道Java程序上生产后,运维人员都会设定好JVM的堆大小,而且还是把最大最小设置成一样的值.那究竟是为什么呢?一般而言,Java程序如果你不显示设定该值得话,会自动进行初始化设定. -X ...

  4. Java生产环境下性能监控与调优详解

    1:JVM字节码指令与 javapjavap <options> <classes>cd monitor_tuning/target/classes/org/alanhou/m ...

  5. Java设置环境变量

    客上转过来的. 非常多人写了非常久java代码.还不知道环境变量是怎么一回事.科普一下. 一.java设置环境变量 - 精简版   1.右键打开我的电脑->属性->高级->环境变量 ...

  6. Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)

    之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...

  7. 配置算法(第4版)的Java编译环境

    1. 下载 1.1 JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html选择“Windows x64 180.5 ...

  8. 【原】Storm Local模式和生产环境中Topology运行配置

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  9. [原]生产环境下的nginx.conf配置文件(多虚拟主机)

    [原]生产环境下的nginx.conf配置文件(多虚拟主机) 2013-12-27阅读110 评论0 我的生产环境下的nginx.conf配置文件,做了虚拟主机设置的,大家可以根据需求更改,下载即可在 ...

随机推荐

  1. 基于Thinkphp5.0 小程序登录插件应用

    资源连接: wulongtao/think-wxminihelper 具体怎么安装,不介绍了,有不懂再问我吧: 主要重点如下: wepy:index.wpy this.$parent.getUserI ...

  2. HDOJ5540 Secrete Master Plan

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5540 题目大意:给一个两个2*2的矩阵,第二个矩阵能不能通过旋转得到第一个矩阵 题目思路:模拟 #in ...

  3. Hdoj 1875.畅通工程再续 题解

    Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖 ...

  4. CISCO运维记录之3650堆叠设备升级IOS(Version 16.3.6版本存在bug)

    CISCO运维记录之3650堆叠设备升级IOS(Version 16.3.6版本存在bug) 思科3000系列交换机使用cat3k_caa-universalk9.16.3.6版本存在bug,设备运行 ...

  5. noiac64 sort (二分答案)

    首先如果L=1,那就可以直接用一个优先队列来做 但它并不是1 所以要换个做法 假设我们已经知道第L的数是x,第R的数是y 那其实就只需要找到[x+1,y+1]这一段,然后再加上一定数量的x和y就是答案 ...

  6. urls 管理

    问题阐述:如何管理多个app下的路由分发,使得管理更加清晰? 1. 在app下创建urls.py文件 from django.conf.urls import url from django.urls ...

  7. 天梯赛 L2-001 紧急救援

    L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...

  8. ubuntu 15 安装docker

    最近听说Docker很火,不知道什么东西,只知道是一个容器,可以跨平台.闲来无事,我也来倒弄倒弄.本文主要介绍:Ubuntu下的安装,以及基本的入门命令介绍:我的机器是Ubuntu 15.04 64位 ...

  9. [luogu3938][斐波那契]

    题目链接 思路 首先可以看出来每个月新增的兔子构成的斐波那契数列.然后每代兔子都可以用斐波那契数列中的一个数来表示.所以对于每只兔子都能在斐波那契数列中找到他所属的一个位置.因为每个兔子都是在两个月之 ...

  10. jquery基本语法(一)

    https://www.cnblogs.com/haiyan123/p/7657151.html 一.jQuery基础1.为什么要用jquery?    写起来简单,省事,开发效率高,兼容性好2.什么 ...