Maven… 它是什么?
1.1. Maven… 它是什么? 如何回答这个问题要看你怎么看这个问题。 绝大部分Maven用户都称Maven是一个”构建工具”:一个用来把源代码构建成可发布的构件的工具。 构建工程师和项目经理会说Maven是一个更复杂的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发。像 Maven 这样的一个项目管理工具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团 队成员间的交流。 一个更正式的 Apache Maven 的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。 别让Maven是一个”项目管理”工具的事实吓跑你。如果你只是在找一个构建工具,Maven能做这个工作。 事实上,本书的一些章节将会涉及使用Maven来构建和分发你的项目。 1.2. 约定优于配置(Convention Over Configuration) 约定优于配置是一个简单的概念。 系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置。 流行的框架如 Ruby on Rails 和 EJB3 已经开始坚持这些原则,以对像原始的 EJB 2.1 规范那样的框架的配置复杂度做出反应。 一个约定优于配置的例子就像 EJB3 持久化,将一个 特殊的Bean持久化,你所需要做的只是将这个类标注为 @Entity 。 框架将会假定表名和列名是基于类名是属性名。 系统也提供了一些钩子,当有需要的时候你可以重写这些名字,但是,在大部分情况下,你会发现使用框架提供的默认值会让你的项目运行的更快。 Maven通过给项目提供明智的默认行为来融合这个概念。 在没有自定义的情况下,源代码假定是在 ${basedir}/src/main/java,资源文件假定是在 ${basedir}/src/main/resources 。测试代码假定是在 ${basedir}/src/test […]
JDK5.0垃圾收集优化之–Don’t Pause
作者:江南白衣,最新版链接:http://blog.csdn.net/calvinxiu/archive/2007/05/18/1614473.aspx,版权所有,转载请保留原文链接。 原本想把题目更简单的定为–《不要停》的,但还是自己YY一下就算了。 Java开发Server最大的障碍,就是JDK1.4版之前的的串行垃圾收集机制会引起长时间的服务暂停,明白原理后,想想那些用JDK1.3写Server的先辈,不得不后怕。 好在JDK1.4已开始支持多线程并行的后台垃圾收集算法,JDK5.0则优化了默认值的设置。 一、参考资料: Tuning Garbage Collection with the 5.0 Java Virtual Machine 官方指南。 Hotspot memory management whitepaper 官方白皮书。 Java Tuning White Paper 官方文档。 FAQ about Garbage Collection in the Hotspot 官方FAQ,JVM1.4.2。 Java HotSpot 虚拟机中的垃圾收集 JavaOne2004上的中文ppt A Collection of JVM Options JVM选项的超完整收集。 二、基本概念 1、堆(Heap) JVM管理的内存叫堆。在32Bit操作系统上有1.5G-2G的限制,而64Bit的就没有。 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1G。 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4但小于1G。 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。 默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio=指定。 服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小,所以上面的两个参数没啥用。 2.基本收集算法 复制:将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。 标记清除(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。 标记整理(mark-sweep-compact):综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。 可见,没有免费的午餐,无论采用复制还是标记清除算法,自动的东西都要付出很大的性能代价。 […]
编写对GC友好,又不泄漏的代码
作者:江南白衣,最新版链接:http://blog.csdn.net/calvinxiu/archive/2007/05/22/1621051.aspx,版权所有,转载请保留原文链接。 看到JavaOne2007上有篇《Garbage-Collection-Friendly Programming》的68页PPT,心想都2007了还谈这个基本问题,一定总结得很全面了才好意思站出来讲吧。 GC的基础概念见上篇:JDK5.0垃圾收集优化之–Don’t Pause 1.使用更多生命周期短的、小的、不改变指向(immutable)的对象,编写清晰的代码。 出于懒惰也好,朴素的节俭意识也好,我们都习惯对一个变量重用再重用。但是…. Java的垃圾收集器喜欢短生命周期的对象,对象如果在新生代内,在垃圾收集发生前就死掉了,垃圾收集器就什么都不用做了。 现代JVM构建一个新对象只需要10个本地CPU指令,并不弱于C/C++。 (但垃圾收集没有压缩算法时会稍慢,更频繁的New对象也导致更频繁的GC)。 大对象的分配效率更低,而且对非压缩算法的垃圾收集器,更容易造成碎片。 对象重用增加了代码的复杂度,降低了可读性。 所以有标题的呼吁,比如不要害怕为中间结果分配小对象。但编程习惯的改变也不是一朝一夕的事情。 2.将用完的对象设为NULL其实没什么作用。 貌似很酷的把对象主动设为Null 的”好习惯”其实没什么用,JIT Compiler会自动分析local变量的生命周期。 只有一个例外情况,就是String[1024] foo 这种赤裸裸的数组,你需要主动的foo[100]=null释放第100号元素,所以最好还是直接用ArrayList这些标准库算了。 3.避免显式GC–System.gc()。 大家都知道System.gc()不好,full-gc浪费巨大,gc的时机把握不一定对等等,甚至有-XX:+DisableExplicitGC的JVM参数来禁止它。 哈哈,但我还不会用System.gc()呢,不怕不怕。真的不怕吗? 先用FindBugs 查一下所用到的全部第三方类库吧… 至少RMI 就会老实不客气的执行System.gc()来实现分布式GC算法。但我也不会用RMI啊。那EJB呢,EJB可是建在RMI上的…. 如果无可避免,用-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 (单位为微妙) 增大大GC的间隔(原默认值为1分钟),-XX:+ExplicitGCInvokesConcurrent 让System.gc() 也CMS并发执行。 4.继续千夫所指的finalize() 大家也都知道finalize()不好,分配代价昂贵,释放代价更昂贵(要多走一个循环,而且他们死得慢,和他们相关联的对象也跟着死得慢了),又不确定能否被调用(JVM开始关闭时,就不会再进行垃圾收集),又不确定何时被调用(GC时间不定,即使system.gc()也只是提醒而不是强迫GC,又不确定以什么样的顺序调用,所以finalize不是C++的析构函数,也不像C++的析构函数。 我们都知道啊,所以我从来都没使用。都是在显式的维护那些外部资源,比如在finally{}里释放。 5.WeakReference/SoftReference 这是个平时不怎么会搭理,偶然知道了又觉得有用的Java特征。大家都知道Java里所有对象除int等基本类型外,都是Pass by Reference的指针,实例只要被一个对象连着,就不会被收集。 而WeakReference就是真正意义上的C++指针,只是单纯的指向一个对象,而不会影响对象的引用计数。 而SoftReference更特别,在内存足够时,对象会因为SoftReference的存在而不被收集,但内存不足时,对象就还是会被收集,怎么看都是做简单缓存的料子。代码如下: Foo foo = new Foo(); SoftReference sr= new SoftReference(foo); Foo bar = sr.get(); […]
myeclipse 6 hot key content assist
为什么MyEclipse6.0 不出现快速提示,我要把整个单词快打完了才出现,。 如:public class TestMain extends TestCase 如果是以前3.2的extends 直接按“ALT+/”就可以出现这个单词提示, 我现在完全要自己打出来了。这样会浪费很多时间的。 这是不是那么没有设置好呀。 eclipse3.3中把内容助手(content assist)的快捷键由 alt + / 改成了ctrl + space,这又刚好跟我们操作系统的切换输入法的快捷键冲突,所以造成内容助手不能使用了,给写代码带来了极大的不便。 而已前eclipse 3.2版本中的 alt + / 快捷键被作为新的单词补全(word competion)功能的快捷键。所以现在想像以前一样使用alt + / 来实现内容助手的功能,就需要更改eclipse3.3快捷键的设置了。具体操作如下: 1. 点击Windows->Preferences->General->Keys . 2. 在列出的快捷键列表中查找到:word competion,把它的快捷键alt + / 改成其它的快捷键(怎么改,先把此快捷键删除,点右边的按钮”remove binding”, 再选中binding文本框,输入你想要的快捷键)。 3. 在列出的快捷键列表中查找到:content assist,把它的快捷键 ctrl + space 改成我们想的的 alt + / 即可了。
Resin-pro-3.1.6 full crack download
Caucho Technology is an engineering company devoted to reliable open source and high performance Java-PHP solutions. Caucho is a Sun Microsystems Java EE licensee whose products include Resin application server, Hessian web services and Quercus Java-PHP solutions. Resin Professional is the application server of choice for over 7,500 companies. Technical support is handled by Caucho […]
resin-pro-3.1.5 full cracked.
虽然resin-pro-3.1.5早在2月26号就发布了,但一直标记为dev,今天发现已经不是dev了,赶紧下载回来破解。 resin-pro-3.1.5.zip 下载 resin-pro-3.1.5.tar.gz 下载 此次破解的跟上次的3.1.3一样,功能上完全没有任何限制了,可以使用session持久化、cache等,只需要做好相关的配置即可。 3.1.5的Change Log请看官方文档:Resin Change Log,同时可以看到3.1.6 snapshot了。 我会及时破解Resin的最新版本! 文章来源:http://www.dingl.com/blog/archives/28
proxool.FatalSqlExceptionHelper.testException()
我终于找到了出问题的线程了。 通过thread dump 我发现如下线程一直在运行:“resin-tcp-connection-*:80-6075” daemon prio=1 tid=0x0857aac8 nid=0x7fb0 runnable [0x82dfe000..0x82dff19c]at org.logicalcobwebs.proxool.FatalSqlExceptionHelper.testException(FatalSqlExceptionHelper.java:116)at org.logicalcobwebs.proxool.FatalSqlExceptionHelper.testException(FatalSqlExceptionHelper.java:103)at org.logicalcobwebs.proxool.AbstractProxyStatement.testException(AbstractProxyStatement.java:65)at org.logicalcobwebs.proxool.ProxyStatement.invoke(ProxyStatement.java:146)at org.logicalcobwebs.proxool.ProxyStatement.intercept(ProxyStatement.java:57)at $java.sql.Statement$$EnhancerByCGLIB$$1a91e2dc.close()at com.tag.db.doEndTag(valuetag.java:438)at _jsp._rst._eng_0aa__jsp._jspService(_products_0viewinfo__jsp.java:75)at com.caucho.jsp.JavaPage.service(JavaPage.java:60)at com.caucho.jsp.Page.pageservice(Page.java:570)at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:159)at com.kenfor.exutil.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:152)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at com.kenfor.exutil.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:152)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:178)at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:267)at com.caucho.server.port.TcpConnection.run(TcpConnection.java:388)– locked <0x5c472008> (a java.lang.Object)at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)at com.caucho.util.ThreadPool.run(ThreadPool.java:423)at java.lang.Thread.run(Thread.java:595) 然后我又查看了顶级的代码调用at org.logicalcobwebs.proxool.FatalSqlExceptionHelper.testException(FatalSqlExceptionHelper.java:116)也就是testException这个方法一直在执行,我不清楚为什么为会出现如此死循环。 我想问问大家,什么样的代码会导致proxool的testException一直运行着。 ——————————————————————————– 不知道是分数不够,还是人才稀少,怎么就没人回答呢。郁闷 ——————————————————————————– 为什么会重复出现:at com.kenfor.exutil.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:152)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at com.kenfor.exutil.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:152)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)谁能告诉我啊。 ——————————————————————————– 本来proxool是很有口碑的连接池 ,怎么会导致 at org.logicalcobwebs.proxool.FatalSqlExceptionHelper.testException(FatalSqlExceptionHelper.java:116)中testException运行没完没了呢。 ——————————————————————————– 努力接分升级中…帮你up! ——————————————————————————– […]
Java on Guice
Java on GuiceGuice 1.0 User’s Guide Guice (pronounced “juice”) is an ultra-lightweight, next-generation dependency injection container for Java 5 and later. Introduction The enterprise Java community exerts a lot of effort toward wiring objects together. How does your web application get access to a middle tier service, or your service to the logged in user […]
Googlipse-不错的GWT Eclipse插件
最近发现一个很不错的用于在Eclipse IDE下应用GWT开发AJAX的插件,叫Googlipse,名字还很好记,呵呵.它的最近发布版本是0.5.4版,可以支持GWT1.4.60,不过在sourceforge.net里的邮件列表里发现原来这个插件已经停止开发与BUG修复了,真是可惜.现在把安装与使用方法简单翻译一下,以防自己以后忘记,也方便大家学习.不过,本人E文也一般,大致上给翻译一下, 翻译的很生硬,不过主要的信息还是体现出来了,大家将就一下 准备: 1) 下载:http://sourceforge.net/projects/googlipse 2) 安装前提: a) Eclipse 3.2 with WebTools Platform 1.5(一定要装,) b) 已经安装了JDK 1.5以上 c) 还需要下载 Google Web Toolkit , 网址是: http://code.google.com/webtoolkit/ 安装插件到制作实例的全过程(英文是从官方网站上COPY的) (*) Drop the com.googlipse.gwt_<version>.jar file in your eclipse\plugins folder 将com.googlipse.gwt_<version>.jar文件放到你的Eclipse安装文件夹中的plugins文件夹下 (译者注: 我这里用的的com.googlipse.gwt_0.5.4.jar) (*) Open Eclipse. Select Window->Preferences->Googlipse and set GWT home to the directory where you have installed the Google Web […]
2008年最值得学习的5个Java技术
Carlos Perez发表了2008年最值得学习的5个Java技术:1.OSGi(特别是Java动态模型方面)OSGi service platform是一个基于Java的platform,OSGi service platform是一个开放并且提供统一接口标准的体系框架,基于这个体系框架,服务提供商,程序开发人员,软件提供商,服务网管运营商,设备提供商能够协调地联合起来开发,部署以及管理向用户提供的各种服务。2.JCP JAVA内容仓库(Java Content Repository) 2002年一月发布3.GWT (Google Web Toolkit ) 2006年5月发布,Google 推出的一个开发 Ajax 应用的框架,它支持用 Java 开发和调试 Ajax 应用。4.Groovy 2004年5月发布,Groovy是一种基于JVM的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性。Java开发者可以使用类似Java的语法来获得这些特性的支持。5.Cloud computing 云计算(虚拟服务器设计,不使用EJB的分布式运算) 这是一个很有意思的名单,因为以上技术都算比较“老”的技术了,你认为2008最应该值得学习的java技术是什么? 附:什么是JCP JAVA内容仓库(Java Content Repository)? JSR -170把自己定义为一个能与内容仓库互相访问的,独立的,标准的方式。同时它也对内容仓库做出了自己的定义,它认为内容仓库是一个高级的信息管理系统,该系统是是传统的数据仓库的扩展,它提供了诸如版本控制、全文检索,访问控制,内容分类、访问控制、内容事件监视等内容服务。Java Content Repository API(JSR-170)试图建立一套标准的API去访问内容仓库。如果你对内容管理系统(CMS)不熟悉的话,你一定会对内容仓库是什么感到疑惑。你可以这样去理解,把内容仓库理解为一个用来存储文本和二进制数据(图片,word文档,PDF等等)的数据存储应用程序。一个显著的特点是你不用关心你真正的数据到底存储在什么地方,是关系数据库?是文件系统?还是XML?不仅仅是数据的存储和读取,大多数的内容仓库还提供了更加高级的功能,例如访问控制,查找,版本控制,锁定内容等等。 一段时间以来市场上出现了各个厂家开发的不同的CMS系统,这些系统都建立在他们各自的内容仓库之上。问题出现了,每个CMS开发商都提供了他们自己的API来访问内容仓库。这对应用程序的开发者带来了困扰,因为他们要学习不同的开发商提供的API,同时,他们的代码也与这些特定的API产生了绑定。JSR-170正是为解决这一问题而出现的,它提供了一套标准的API来访问任何数据仓库。通过JSR-170,你开发代码只需要引用 javax.jcr.* 这些类和接口。它适用于任何兼容JSR-170规范的内容仓库。我们将通过一个例子来逐步了解JSR-170。为什么需要 Java Content Repository API随着各个厂家各自的内容仓库实现数量的增长,人们越来越需要一组通用的编程接口来使用这些内容仓库,这就是JSR-170所要做的东西。它提供一组通用的编程接口来连接内容仓库。你可以把JSR-170理解为和JDBC类似的API,这样你可以不依赖任何具体的内容仓库实现来开发你的程序。你可以直接使用支持JSR-170的内容仓库;或者如果一些厂家的内容仓库不支持JSR-170则可以通过这些厂家提供的JSR-170驱动来完成从JSR-170与厂家特定的内容仓库的转换。下面这张图描述了使用JSR-170开发的应用系统的结构。在该系统运行的时候,它可以操作内容仓库1,2,3中的任意一个。在这些内容仓库当中,只有2 是直接支持JSR-170的,剩下的两个都需要JSR-170驱动来和应用系统交互。注意:你的应用系统完全不用关心你的数据是如何存储的。1可能使用了关系数据库来存储,而2使用了文件系统,至于上,它甚至更前卫的使用了XML。JSR-170 API对不同的人员提供了不同的好处。●对于开发者无需了解厂家的仓库特定的API,只要兼容JSR-170就可以通过JSR-170访问其仓库。●对于使用CMS的公司则无需花费资金用于在不同种类CMS的内容仓库之间进行转换。●对于CMS厂家,无需自己开发内容仓库,而专注于开发CMS应用。 来自:http://www.iocblog.net/static/2007/475.html