解惑

解己之惑,解人之惑

分类:Java (第8页共20页)

Java技术

Hot Deploy成功

前几天曾经抱怨新公司的开发环境太复杂,不能Hot Deploy,极其影响开发的效率,今天成功的在Eclipse(实际上是MyEclipse)中配置好了可以Hot Deploy的环境,其实也很简单,我们的工程发布非常的复杂,sar, ear, har, jar, war一个套一个,要想严格的按照那个目录结果配置工程几乎不可能,但是要想Hot Deploy很简单,配置一个Web工程,引入全部的工程需要的类,把Jar包修改为手工发布,然后使用MyEclipse的Manage Deployment发布,只要你的这个web工程先于原来的工程发布就行了,对于同名的类,由于新的工程先加载,所以也就可以达到Hot Deploy的目的了,现在修改了源代码,保存一下就可以生效了,爽啊

更新:
关于类加载,找到理论依据:
Packaging J2EE applications for JBOSS 3.2.1

By default, all the EARs in a jboss instance, under, JBOSS_HOME/server/jboss-instance-name/deploy/ use the same loader repository and hence, a class found in one can be used by the other. But we don’t like calling this bug a feature as it goes against the idea of scoping by EAR. Fortunately, JBoss provides a way to supress this behaviour through what they call as deployment based scoping.

JSP的一个小误区

相信很多人在面试的时候都会被问到JSP和Servlet的区别,我认为JSP就是功能受限的Servlet,因为JSP不能作为后台的控制Servlet用,但是实际上我的这个想法是错误的,JSP是可以像普通的Serlvet那样作为控制用的Servlet用的,在web.xml里面定义一下就行了:
    <servlet>
        <servlet-name>control</servlet-name>
        <jsp-file>/jsp/control.jsp</jsp-file>
    </servlet>

AR何其多

看了新公司的发布目录,感叹公司把Java相关的发布包用得出神入化,从最简单的Jar到最常见的War,以及中大型J2EE工程中的Ear,然后是JBoss特定的Sar,以及被Jboss收购后的Hibernate提供的Har,真的是被AR搞混头了,特此列举一下:

  • JAR:java类文件的打包发布
  • WAR:WEB应用的打包发布
  • EAR:J2EE应用的打包发布,一般包括EJB
  • SAR:JBoss的Service打包发布
  • HAR:Hibernate打包发布

2007年7月13日更新:
一个E文的,好像比我的全面:

Intro to JARs, WARs, SARs, RARs and EARs

Anyone worth calling oneself a java developer would know what a JAR file is. It’s an archive, just like ZIPs and TARs are. In addition to being a simple archive, a JAR file can store some very useful meta information about its contents. A special file, META-INF/MANIFEST.MF is where a jar records meta information.

EJBs are packaged as jar files as well, albeit with one or more special files under META-INF, called deployment descriptors.

A WAR file packages a web application. What does a web application consist of? It consists of

  1. HTML/JSP pages and other resources such as images/javascript files/stylesheets that need to be reachable via URLs.
  2. Additional files such as java servlets, utility classes and jars for use in servlets/JSPs and deployment descriptors that should not be reachable via URLs.

The latter are stored under a special folder named WEB-INF. Both are then archived in JAR whose extension is modified as WAR to distinguish it as a java web application.

Similarly, RAR files are JAR files used to package resource adapter modules as defined under the J2EE Connector Architecture (JCA) and SAR files are the ones used to package JMX-enabled services in JBoss.

Just as all rivers are destined to go merge with the sea, all these archives that relate to a single enterprise application may be packaged under one EAR.

太复杂了!!!

今天总算是把工程在Eclipse下配置好了,而且没有任何错误,从Oneal那里拷贝来的工程文件一堆错误,我这个人又是那种容不得满眼全是错误的人,花了一个小时搞定这个问题,开始熟悉项目,结果是:真是太复杂了!
系统的大部分都是通过Web Service调用的,包括和其他的系统集成以及和工作流引擎集成,而Web Service又是通过Session Bean调用DAO,DAO再调用hibernate,而Session Bean用到了版本2和版本3(也就是同时使用了EJB2和EJB3),因此工程有N个EJB的模块,源代码也分布在几十个大大小小的目录中,同时Web工程也是N个模块,另外还使用到了LDAP完成用户登陆,Eclipse工程目前只是用于远程调试和编译,最主要是写代码,完全失去了IDE最重要的功能。(这个是目前的理解,不排除遗漏的东西以及误解)

如果发现问题或者要修改Bug,抱歉,不能Hot Deploy,必须修改代码后使用Ant编译并发布好,然后重启Jboss,Ant一般情况下至少需要5分钟,即使是修改一个properties也要2分钟才能跑完,然后重启Jboss需要8分钟(我的是新安装的机器,比较快,其他的人的需要10分钟左右),天啊,开发效率怎么可能高啊!
不过这也正好给我一个机会,上一家公司的情况也是类似,大家修改什么也是先Ant再重启Jboss,一般也至少要10分钟,后来我就在Eclipse下配置了可以Hot Deploy的工程,如果只是修改代码内容,不新增EJB类或者方法就不用Ant编译了,修改了代码保存下就更新了,开发速度提高很多,我这个月的任务就是在这个公司也把这个工程搞出来,这样弄完以后对项目的熟悉程度也会上一个台阶。

专题

Google面试题解说性能:

  1. Google面试题解说性能之一:字符串运算VS数字运算

  2. Google面试题解说性能之二:分析问题

  3. Google面试题解说性能之三:不要小看循环中的任何一个语句

  4. Google面试题解说性能之四:优化无止境

  5. Google面试题解说性能之五:人比电脑聪明

  6. Google面试题解说性能之六:数学显神威

  7. Google面试题解说性能之七:缓存中间结果

  8. Google面试题解说性能之八:工欲善其事必先利其器

  9. Google面试题解说性能之总结

我看Java:

  1. Java很简单也很难

  2. 没落的Java社区

  3. 也谈Java基础的重要性

  4. 也谈Java基础的重要性(续)

  5. 提高Java技能的几种简单有效的方法

  6. J2SE仅仅是基础

  7. J2EE世界的现状:生机勃勃的生态系统

在线源代码:

  1. Jiehoo
  2. JDK150

工作在上海:

  1. 上海四金缴纳比例

Java序列化确实很慢啊

我们的系统还使用古老的Ant1.5作为构建工具,而且做了一些定制(可能修改了部分源代码),我们就不能随便升级到高版本,而Ant1.5的那个Junit的task比较旧,运行每个TestCase的时候都是重新开一个新的VM,而我们的单元测试框架要读取很多EJB配置文件完成初始化,如果每个TestCase都去解析那些文件就太慢了,每个TestCase至少需要10秒,所以没有办法,我就把所有的Case都手工加到一个TestSuite,然后运行那个Suite,这样就不会重复解析那些文件了。但是手工把那些Case加到Suite里面也是很痛苦的事情,就想到把那些解析的结果缓存下来,最先想到的当然是序列化了,结果让我大跌眼镜,序列化的三个文件一共1.33M,而原来需要解析的XML文件有4.5M,有十几个文件,相互之间还有关联,结果解析那些XML文件只需要不到6秒钟,而反序列化需要7秒多!

使用工具修改代码时一定要谨慎

今天早上来更新了下代码,发现自己负责的和Crystal Report集成的代码突然不能工作了,刚好昨天升级了Crystal Report,而我们明天早上就要做演示的,天啊。
不过好在我是一个经验丰富的老鸟了,这点事情还不至于让我手忙脚乱,看了下控制台,没有异常信息,在关键代码的地方设置了断点,跟踪了下,发现原来工作的一个Query不能工作了,但是异常被截获并忽略了,把异常信息打出来,报的信息是查询无法识别,我没有修改过啊,而且这个查询是提交到Crystal Report Server的,那个Server并没有升级啊,再仔细一看,原来是我的查询被修改了,加了一个/*ARQXXXXX*/的注释,呵呵,原来罪魁祸首是美国那边的架构师,不知道他使用什么工具把我们系统全部代码的SQL前面全加了一个这个注释,但是我的这个查询虽然和SQL很像(也是Select … From … Where),但是实际是完全不同的东西啊,根本就不支持注释。

我同时记起了我自己前两个月犯的一个类似错误,我在造自己的大轮子,那个时候在写表现层的底层部分,生成HTML,在格式化的时候,我开始选择的是使用4个空格作为缩进,但是后来考虑到这样会导致生成的HTML太大,就使用tab替换,但是我写的单元测试已经是使用空格了,所以使用UltraEdit使用表达式进行全部替换,结果我的代码全部没有了(UltraEdit的那个功能没有Undo),因为我的代码也是使用四个空格作为缩进的,好在还能恢复很多,因为Eclipse是带本地历史记录功能的,可以恢复到上一次修改的状态,然后把最后的一次修改再做一下(浪费了一个小时的时间)。

更新:架构师的批量修改又有新问题,一些调用Oracle的存储过程的SQL也被加了那个,但是也不能加

数据库可移植性重要吗?

对于大部分应用而言,数据库可移植性可能不太重要,而一些完全使用ORM的应用可能也问题不大,但是一旦需求来了,它就变得非常的重要,现在我们就遇到了这样的需求。
我们原来一直使用Oracle,也从来没有想到要更换数据库类型,所以我们一直心安理得的使用各种Oracle优化技巧来优化我们的SQL(我们的系统的性能要求也比较高),现在有个新客户,要求使用SQL Server,这下就麻烦大了,初步估计需要5000个小时!
这个变化也影响到我们做的水晶报表,原来没有考虑数据库迁移,所以选择数据库连接的时候直接选择的就是Oracle服务器,而不是建一个ODBC的数据源,而水晶报表的数据库配置是不能随便修改的,不说更换数据库类型,就是更换一下服务名都不行。

PS:据说微软愿意为我们的数据库迁移支付一部分的成本,呵呵,果然是财大气粗啊。

没落的Java社区

感觉原来的几个Java社区日益没落,当然这个和Java世界的消沉有很大关系,这两年已经看不到什么大的Java新闻了,特别是对于Java开发人员而言的大新闻,原来Spring带来的各种火热的讨论也已经沉寂下来,Java世界似乎已经毫无新意了,现有的任何Java开源产品或者组件所能够带来的开发效率的提升都无法和新的脚本语言匹敌(我想这也是为什么JavaEye会使用RoR重写的一个重要原因,同时也是Robin转向研究Ruby的重要原因),在可以预见的一段时间以内,都不太可能出现一颗真正的银弹。但是我对于Java并没有丧失信心,因为Java依然拥有广大的开发人员以及丰富的开源产品和组件,现在所缺少的是一个真正简单并且易用的快速开发框架,提供Java Web开发所必备的大部分功能,开发人员所需要关注的仅仅是创建数据库和业务逻辑代码(不需要开发常见的CRUD操作代码),当然开发人员也不需要太多的配置就能够让整个系统跑起来(不需要Spring的Bean配置、Struts的Action配置、Hibernate的配置)。
就我个人感觉,完成这样的一个框架并不是很难,困难在于Java世界应该引入更多的规则而不是可配置,最起码可配置是第二位的需求,但是Java世界的人似乎已经习惯了配置,习惯了对象间的关系是在运行时通过读取配置文件来确定,也习惯了通过读取配置文件来组装系统。
对于多人并行开发的系统而言,Java的强类型约束无疑对于代码的可维护性和可读性更加有利,但是基础设施的严重缺失使得代码的开发难度加大,代码的重复性也因此加大(对于一个简单功能,由于Java本身没有提供,只能自己写、寻找其它的开源组件或者公司自己的框架提供,但是很多新来的人不知道已经有那样的功能,即使知道也是拷贝一份代码稍加修改)。
我相信现在有很多人都有和我一样的想法,也有很多人在做,包括EasyJF(简易Java框架),问题是他们并不能真正的普及,他们的设计者和维护者并不能得到大部分人的认可,而像AppFuseSpringSideJdonFramework这样拼凑起来的快速开发框架也不能解决问题(还是需要大量的配置),我期望中的真正的Java快速开发框架是完全重写的基于规则的框架,不需要配置或者只需要极少的配置(例如数据库配置),具有强大的Model和View的转换能力,可以很容易的将POJO或者POJO集合转换为各种页面组件(表格、树),不需要POJO和数据库的映射配置,不需要写CRUD代码,URL请求自动映射到Action。。。。。。

也谈Java基础的重要性(续)

呵呵,意犹未尽,继续批驳。
banq先生对自己的思维和真正想法并不是了然于胸,我想他不关心的是业务逻辑的实现了,他说他已经很多年不去翻J2SE了,那是因为他已经很多年不是“程序员”了,他不需要使用他的框架去完成一个实际的业务系统,你把这个框架做了,你鼓动别人去使用框架,去学习设计,还有意义吗?如果别人都去提高学习了,都去设计了,就不会有人用他的框架,而如果别人都不用,那他搞那个框架又是为了什么呢?
他说他自己对J2SE都忘记了,那么他是如何完成这个基于Java的框架的?难到都是拷贝别人的代码,然后就是debug?

再说他所谓的向上思维和向下思维,其实不是思维问题,而是开发方法问题,他所谓的向上思维是敏捷开发所推崇的,自底向上实现系统,发现问题就不断的重构系统,而CMM/CMMI以及RUP之类的开发方法就崇尚自顶向下实现,也就是他所谓的向下思维,这些方法的优劣现在本身就没有定论,也不会有定论,需求的不同导致使用不同的开发方法有不同的效果,IBM之类的大公司接单子都是预先浪费了无数的时间确定需求,然后签合同,完全按照合同的内容来执行,他们有资格使用自顶向下设计;而广大的中小软件公司没有那个本事,可怜兮兮的拿下一个单子也只能当孙子,客户让怎么改还不是怎么改?能拿到钱就不错了。所以这些公司使用自底向上就很自然了,因为快捷简单,能够更好的应付需求的变化(当然,要做好也非常的不简单)。

一个新技术不必关心它是如何做出来的,而是重点研究是如何使用它,使用的场合和条件是什么,这些就是模式啊”,天啊,这个是模式吗?模式是程序内部的设计好不好!怎么会和技术的使用场合和条件扯上关系呢?

如果我说不学习"数据结构,操作系统,编译原理,数学",照样可以作出架构优质的高性能Java系 统,你可能不惊奇了,Collection和数据库技术已经就是依据数学结构做出来的,你学了数学结构,自以为懂了很基础知识,碰到 COllection,你就会自然去打开看看,自豪运用你的数学结构理解它一番,可是这些对于你如何使用COllection根本是两个领域的知识(如何 使用Collection是模式领域知识),这些都是先入为主造成浪费时间,能力不足的表现
呵呵,他的那个叫做“作出”的吗?据我所知充其量是拼出来的,系统最核心的部分都是别人的(当然,这个也不惊奇,因为他最自豪的就是可以看懂别人的设计和使用别人的成果),当然不需要数据结构了。学习Collection的实现会浪费时间吗?看这个对于设计能力难到没有提高吗?看别人的设计就是能力不足了,想想自己当初是怎么学习设计模式的!
算了,不说了,记得原来gigix就写过一篇文章批驳过他的。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑