郁闷死~~昨天晚上断网 害得我没发成这篇日志~~googlerobots 会不会以为我没有天天更新blog的毅力啊~~排名有靠后了!
传统的图:
深入理解JMM more understanding about jmm java memory model(本站开始做英文SEO了)
深入理解JMM的重点
JMM具体规定要JLS的 “Thread and lock”一章中,可以说这是一章非常晦涩的一个规范,要想完全把
它理解清楚,一般的辛苦是不行的.那是要”相当的~~~”的辛苦.而要把它向别人再解释清楚,那简直就
是恶梦.
作者自知无力能全面清楚地向大家说明这一章的内容,但以作者的经验,主要从以下两个方面去理解
可以改快地抓住本质.而不至于陷入”Thread and lock”的泥潭.
一.理解主存储区和线程工作存储区.
二.理解同步的两个功能.
首先要明白的问题:
1.多个线程共有的字段应该用synchronized或volatile来保护.
2.synchronized负责线程间的互斥.即同一时候只有一个线程可以执行synchronized中的代码.
3.volatile负责线程中的变量与主存储区同步.但不负责每个线程之间的同步.
[Main Memory]与[Working Memory]

Main Memory是实例所在的存储区,所有实例和实例的字段都在此区域,为所有线程所共有.
Working Memory是绺个线程独自所拥有的存储区.其中有Main Memory中部分COPY.
根据Java语言规范中的说明,JVM系统中存在一个
主内存(Main Memory),Java中所有的变量存储在主内存中,对于所有的线程是共享的(相当于黑板,其他人都可以看到的)。
每个线程都有自己的工作内存 (Working Memory),工作内存中保存的是主存中变量的拷贝,(相当于自己笔记本,只能自己看到),工作内存由【缓存】和【堆栈】组成,其中缓存【所谓的stack 栈?不明白啊】保存的是主存中的变量的 copy,堆栈保存的是线程局部变量。线程对所有变量的操作都是在工作内存中进行的,线程之间无法直接互相访问工作内存,变量的值得变化的传递需要主存来 完成。在JMM中通过并发线程修改的变量值,必须通过线程变量同步到主存后,其他线程才能访问到。
大体上来讲,线程对某个变量的操作可以简化成下面的步骤:
1.从主内存中复制数据到工作内存
2.执行代码,对数据进行各种操作和计算
3.把操作后的变量值重新写回主内存中
当然这样的运行顺序也是我们所期望的!但是, JVM并不保证第1步和第3步会严格按照上述次序立即执行。因为根据java语言规范的规定,线程的工作内存和主存间的数据交换是松耦合的,什么时候需要 刷新工作内存或者什么时候更新主存的内容,可以由具体的虚拟机实现自行决定【悲了个剧】。由于JVM可以对特征代码进行调优,也就改变了某些运行步骤的次序的颠倒,那 么每次线程调用变量时是直接取自己的工作存储器中的值还是先从主存储器copy再取是没有保证的,任何一种情况都可能发生。同样的,线程改变变量的值之 后,是否马上写回到主存储器上也是不可保证的,也许马上写,也许过一段时间再写。
那么,在多线程的应用场景下就会出现问题了,多个线程同时访问同一个代码 块,很有可能某个线程已经改变了某变量的值,当然现在的改变仅仅是局限于工作内存中的改变,此时JVM并不能保证将改变后的值立马写到主内存中去,也就意 味着有可能其他线程不能立马得到改变后的值,依然在旧的变量上进行各种操作和运算,最终导致不可预料的结果。
这样的情况是不是就不能避免了呢?
Java程序员都知道synchronized关键字强制实施一个互斥锁,使得被保护的代码块在同一时间只能有一个线程进入并执行。当然 synchronized还有另外一个方面的作用:在线程进入synchronized块之前,会把工作存内存中的所有内容映射到主内存上,然后把工作内 存清空再从主存储器上拷贝最新的值。而在线程退出synchronized块时,同样会把工作内存中的值映射到主内存,但此时并不会清空工作内存。这样一 来就可以强制其按照上面的顺序运行,以保证线程在执行完代码块后,工作内存中的值和主内存中的值是一致的,保证了数据的一致性!
参考:http://www.javaeye.com/topic/438068
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论与实践中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性限制提出一些建议。
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。
互斥 即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。
可见性要更加复杂 一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的【就是修改必须同步到主存的意思?】 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
内存模型 (memory model)
内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节.
不同平台间的处理器架构将直接影响内存模型的结构.
在C或C++中, 可以利用不同操作平台下的内存模型来编写并发程序. 但是, 这带给开发人员的是, 更高的学习成本.
相比之下, java利用了自身虚拟机的优势, 使内存模型不束缚于具体的处理器架构, 真正实现了跨平台.
(针对hotspot jvm, jrockit等不同的jvm, 内存模型也会不相同)
内存模型的特征:
a, Visibility 可视性 (多核,多线程间数据的共享)
b, Ordering 有序性 (对内存进行的操作应该是有序的)
All instance fields, static fields and array elements are stored in heap memory . Local variables ( §14.4) , formal method parameters ( §8.4.1) or exception handler parameters are never shared between threads and are unaffected by the memory model.
目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少。本人把自己经过经验总结和实际运用中的体会.
序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另 一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网 络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。
1.对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
2.java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接 上传递。利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
从上面的叙述中,我们知道了对象序列化是java编程中的必备武器,那么让我们从基础开始,好好学习一下它的机制和用法。
java序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Serializable接口的类对象可以转换成字节流或从 字节流恢复,不需要在类中增加任何代码。只有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意:不是每个类都可序列化,有些类是不能序列化的, 例如涉及线程的类与特定JVM有非常复杂的关系。
序列化机制:
1.反射机制概述
Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说”自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。[1]
转载自:http://www.blogjava.net/zhvfeng/archive/2010/08/17/329078.html
众所周知,所有的Java class文件都是由JVM(虚拟机)加载并执行的。深入理解JVM对于我们提高Java技术和解决Java问题都有非常大的帮助。
JVM内部主要包括内存管理和Class Loader(类加载器)两个部分。熟悉了内存管理,我们就会清楚程序在内存中是怎么分配和执行的,就能解决所有和对象相关的问题(比如Memory Leak)。理解了Class Loader,就能解决所有类找不到(比如遇到NoClassDefFoundError或ClassNotFoundException)或配置文件找不到问题。
这次我们只讨论JVM的Class Loader,下次再讨论JVM的内存管理。
Class Loader的主要作用就是负责查找类并将其加载到内存中。有趣的是,Java中的Class Loader也是由Java所写,就和普通的class一样。这就产生了一个是鸡生蛋还是蛋生鸡的问题,到底第一个class由谁来加载呢?我们稍后会来讨论这个问题。
先来看一下Class Loader所具有的特点。
1. 继承关系
虽然Class Loader也是一个Java class,但这里的继承不是指定义class时使用的extends关键字来实现的继承,而是指由属性来维持的继承关系。即通过Class Loader的构造方法或其它方法显式的设置一个父Class Loader。
—Jakarta common:
Commons Logging:Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。 它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细 节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现.
Commons-Latka:是一个HTTP 功能测试包,用于自动化的QA,验收和衰减测试.
Commons-Pool:提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实
Commons-Math:Math 是一个轻量的,自包含的数学和统计组件,解决了许多非常通用但没有及时出现在Java标准语言中的实践问题.
Commons-Jelly:Jelly能够把XML转换成可执行代码,所以Jelly是一个基于XML与Java的脚本和处理引擎。 Jelly借鉴了JSP定指标签,Velocity,Cocoon和Xdoclet中的脚本引擎的许多优点。Jelly可以用在命令行,Ant或者Servlet之中。
Commons-FileUpload:FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力.
Commons-BeanUtils 提供对 Java 反射和自省API的包装
Commons-Chain 提供实现组织复杂的处理流程的“责任链模式”.
Commons-Codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL encoder.
Commons-Collections提供一个类包来扩展和增加标准的 Java Collection框架
Commons-Discovery提供工具来定位资源 (包括类) ,通过使用各种模式来映射服务/引用名称和资源名称。
Commons-EL 提供在JSP2.0规范中定义的EL表达式的解释器.
Commons-Jexl 是一个表达式语言,通过借鉴来自于Velocity的经验扩展了JSTL定义的表达式语言。.
Jakarta Commons HttpClient 作为HTTP客户端组件与服务器进行通讯,同时使用了jdom进行XML数据的解析。
Jakarta Commons Net 一个用于操作Internet基础协议(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP,以及SMTP)的底层API。 Net包不仅支持对各种低层次协议的访问,而且还提供了一个高层的抽象。它使得开发者不再需要直接面对各种协议的Socket级的低层命令。
Commons-Configuration 工具可以(从 *Properties文件 *XML文件 *JNDI *JDBC 数据源 *System properties *Applet parameters *Servlet parameters等)来读取相应的信息
Commons-validator 提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则。支持校验规则的和错误消息的国际化。
Commons-Digester 基于规则的XML文档解析,主要用于XML到Java对象的映射.
Commons Betwixt 这个组件提供一个XML自省(introspection)机制用来把Java Bean映射到XML文档.他实现了与标准的Introspector及BeanInfo类相似的XMLIntrospector及XMLBeanIfno类.
Commons-Convert 的目标是提供一个简单的包来完成把一种类型的对象转换成另一种.但它目前只支持String到Object或Object到String的转换.
Commons4E 这个Eclipse插件方便了利用Jakarta Commons组件所进行地开发.Commons4E根据用户选择的字段(fields)利用commons-lang builders来自动生成以下方法:toString(),hashcode(),equals(Object)和 compareTo(Object).
Commons-Email 的目的是提供一组用于发送Email的API,它基于Java Mail API基础之上并进行了简化。它提供的主要Java类有:SimpleEmail:这个类用于发送简单的文本类型email。MultiPartEmail:这个类允许发送文本消息并附带附件。HtmlEmail:用于发送Html格式的附件并支持内含图片。EmailAttachment:这是一个简单的容器类用于简化附件的处理。
Commons-IO 是Jakarta Commons项目的一个子项目。用来帮助进行IO功能开发.它包含三个主要的领域:Utility classes-提供一些静态方法来完成公共任务.Filters-提供文件过滤器的各种实现.Streams-提供实用的Stream,reader与 writer实现.
—
ANother Tool for Language Recognition(ANTLR):它的描述语言可以生成 词法分析器、语法分析器与语义分析器,也就是说,我们可以用它来识别加工不同的语言(编译器的编译器)。它同时支持3大类语言的输出:C++, Java, C#(按照生日排序),也就是说,我们可以利用它来用C#生成编译器,它是这样的一种工具,它可以接受词文法语言描述,并能产生识别这些语言的语句的程 序。作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法,使之告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。 ANTLR知道怎样去生成识别程序,语言包括Java,C++,C#. 。类似的还有coco/r 。
cglib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java 接口。Hibernate用它来实现PO字节码的动态生成。主页 http://cglib.sourceforge.net/
c3p0-0.8.4.5.jar 是一个容易使用的java库,用于扩充传统的基于驱动管理的JDBC驱动和JNDI绑定数据源,包括执行Connection和Statement Pooling的数据源。
cleanimports是对java文件中的无用的imports作清理,并通过配置文件提供的格式对imports代码段进行格式整理。
concurrent-1.3.2.jar 包提供标准化、高效的版本的实用的类,用于并行的Java程序。http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
connector.jar 是JCA(J2EE Connector Architecture)规范的包
dom4j-1.5.2.jar Dom4J是一个在Java平台上使用Java Collections Framework与XML、 XPath和XSLT协同工作的开源Java库,它全面支持DOM、SAX和JAXP。
ehcache-1.1.jar EHCache 是一个纯java的在进程中的缓存,它具有以下特性:快速,简单,为Hibernate2.1充当可插入的缓存,最小的依赖性,全面的文档和测试。官方网站 http://ehcache.sourceforge.net/
jaxen-1.1-beta-4.jar 是一个用Java开发的XPath 引擎,用于配合各种基于XML的对象模型,如DOM, dom4j ,JDOM以及Java Beans。
jboss-cache.jar 是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能。缓存数据被自动复制,让你轻松进行JBoss服务器之间的集群工作。JBossCache能够通过JBoss应用服务或其他J2EE容器来运行一个MBean服务,当然,它也能独立运行。JBossCache包括两个模块:TreeCache和TreeCacheAOP。TreeCache –是一个树形结构复制的事务处理缓存。TreeCacheAOP –是一个“面向对象”缓存,它使用AOP来动态管理POJO(Plain Old Java Objects) 注:AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。官方网站 http://www.jboss.org/products/jbosscache
jboss-jmx.jar JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。
oscache-2.0.2.jar OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API–OSCache API给你全面的程序来控制所有的OSCache特性。永久缓存–缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。支持集群–集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。官方网站 http://www.opensymphony.com/oscache/
proxool-0.8.3.jar Proxool是Java数据库连接池,它能向存在的JDBC驱动中透明的增加数据库连接池。
swarmcache-1.0rc2.jar SwarmCache是一个简单且有效的分布式缓存,它使用IP multicast与同一个局域网的其他主机进行通讯,是特别为集群和数据驱动web应用程序而设计的。SwarmCache能够让典型的读操作大大超过写操作的这类应用提供更好的性能支持。SwarmCache使用JavaGroups来管理从属关系和分布式缓存的通讯。官方网站 http://swarmcache.sourceforge.net/
xalan-2.6.jar Xalan名称来自于一种罕见的乐器。Xalan-Java是一个将XML转换成HTML、text或其他XML文件类型的XSLT(XSL Transformations)处理机制。它使用XSL Transformations (XSLT) Version 1.0 and XML Path Language (XPath) Version 1.0。它在命令行方式、applet、servlet、或其他程序的模块中都可以使用。Xalan同时构建于SAX2和DOM level 2上。官方网站;http://xml.apache.org/xalan-j/
xerces-2.6.2.jar Xerces(名称来源于一种叫Xerces Blue的蝴蝶)提供世界级的XML解析和产生。充分验证的语法分析可用于Java和C++,执行W3C的XML和DOM(Level1 and2)标准,以及SAX(version 2)标准。其语法具有高模块化和可配置化。同时提供支持XML Schema(W3C标准草案)。
checkstyle 检查java程序源代码编码风格的,是java程序员不可或缺的工具,用以检查自己的编码习惯是否符合公司的要求或sun的约定。当然如果你用了ide, 那里可能有相应的功能或插件来帮助程序员来完成这项工作。也如checkstyle其名所示,它只检查,不进行beautifier操作。所以,它应比较 适合用于项目管理,用于dailybuild.如果你想借助工具来beautifier你的java源代码,可以参考我写的jalopy安装使用.
Clickstream:它是一个JavaServlet过滤器,用来跟踪用户请求(比如:点击)和请求 队列(比如:点击流)以向网络管理员显示谁在她的网站上以及每个用户正在访问那个页面。 http://www.opensymphony.com/clickstream/
Cargo是一个Java类包用来操作当前J2EE容器.它提供了Ant和Maven API来停止/启动/配置Java容器也提供了Java API来解释/创建J2EE组件.
DbUnit是为数据库驱动的项目提供的一个对JUnit 的扩展,除了提供一些常用功能,它可以将你的数据库置于一个测试轮回之间的状态。
iText是一个能够快速产生PDF文件的java类库。iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的。它的类库尤其与java Servlet有很好的给合。使用iText与PDF能够使你正确的控制Servlet的输出。
DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务 端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本 DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-logging日记操作.
Java2Html 能够的把java源代码转换为高亮有序的HTML, RTF, TeX 与 XHTML格式。这个开源项目有一个java applet 与许多插件以便能够与其它系统很好的给合。
jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展,让你快速简单地定义mock objects,因此不必打破程序间的关联,让你定义灵活的超越对象之间交互作用而带来测试局限,减少你测试地脆弱性。
PMD是一个Java源码分析器。它可以发现不需要使用的变量,空的Catch块和不需要创建的对象等。它还包含一个CPD工具可以探测一块代码中相同的部分。
OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当 作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。 【VeloEclipse :Velocity在Eclipse平台下的一个辅助开发插件】
Jakarta ORO一套文本处理工具,能提供perl5.0兼容的正则表达式,AWK-like正则表达式, glob表达式。还提供替换,分割,文件名过虑等功能.
caucho:Burlap是一个轻量级的XML RPC协议.利用Burlap Web服务协议使用Web服务不需要大型的框架也不用学习其它协议字母汤(alphabet soup).
Caucho Resin提供了最快的jsp/servlets运行平台。它支持Servlet,XSL Filtering6并且具备XSLT和XPath1.0引擎。
Caucho Hessian也是一个轻量级的,自定义描述的二进制RPC协议.因为它是一个二进制协议,所以它很适合于发送二进制数据而需要使用其它附件来扩展这个协议.【阿里的 HSF 基于这个的 貌似】
—
cos上传组件它是著名O’Reilly的图书出版公司开发的。这个上传的组件做得很棒。
EasyMock为Mock Objects提供接口并在JUnit测试中利用Java的proxy设计模式生成它们的实例。EasyMock最适合于测试驱动开发。
FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成HTML。模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度。
Jamon是一个Java文本模板引擎,用于生成动态HTML, XML,或任何基于文本的内容。它有一个丰富的功能集,支持封装,参数化,功能分解,表达逻辑重用。模板声明它们要求生成的参数,包括动态模板内容 (“fragments”),并被翻译成带有公有方法的Java类,它的符号反映了在模板中声明的参数。
JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports 支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。
Java Excel API(JXL)是一个成熟,开源的Excel电子表格读取,修改,写入的项目。Java开发 者利用它简单,便利的API就能够读取Excel电子表格,进行修改并能够把修改后的变化写到任何output stream中(如:Disk, HTTP, database, 或任何socket),这个项目基于GPL发布,而且对中文有很好的支持。● 支持字体、数字、日期操作● 能够修饰单元格属性● 支持图像和图表
JOTM 是一个基于Java开放源代码的事务处理管理器。它遵循JTA APIs规范与Business Transaction Protocol(BTP)规范以提供了对WebService的支持。
ObJectRelationalBridge-OJB是基于XML的对象/关系映射工具.OJB提供一些高级的特性如:对象缓存,延迟加载,利用事务隔离级别的结构进行分布式管理,支持悲观与乐观锁.OJB还提供了一个灵活的配置与插件机制以便可以扩展加入自己的功能.
Jakarta POI可以让你使用Java来读写MS Excel ,Word文件.
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个, 甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。
toplink oracle o/r mapping
【我最近在研究 htmlClient 和htmlUnit相关的东东】
XStream,可以方便地将任意java对象序列化成xml或者json,后者需要jettison-1.0.1.jar库的支持。