2009年2月24日星期二

[异常]java.lang.UnsupportedClassVersionError: Bad version number in .class file

java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:425)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:445)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)


今天看到它,真有些手足无措,因为从提示信息中我得不到任何有用的线索。直到Google了一下才知道是JDK版本的问题。项目是从别人的机器上拷贝来的,环境设的是JDK5,而我的默认的是JDK6,便出现了这个问题,将项目的编译器改成JDK5就可以了。

2009年2月10日星期二

Exception loading sessions from persistent storage

今天在Glassfish V3上运行项目时总是时不时地出现以下两个错误(两个错误不同时出现):
错误信息(1)

严重: PWC2773: Exception loading sessions from persistent storage
java.lang.ClassCastException: cannot assign instance of java.lang.String to field cn.beans.UserSession.time of type java.util.Date in instance of cn.beans.UserSession
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2032)
at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1212)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1953)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at org.apache.catalina.session.StandardSession.readRemainingObject(StandardSession.java:1835)
at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1767)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at org.apache.catalina.session.StandardSession.deserialize(StandardSession.java:1106)
at org.apache.catalina.session.StandardManager.readSessions(StandardManager.java:513)
at org.apache.catalina.session.StandardManager.doLoadFromFile(StandardManager.java:443)
at org.apache.catalina.session.StandardManager.load(StandardManager.java:413)
at org.apache.catalina.session.StandardManager.start(StandardManager.java:874)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5331)
at com.sun.enterprise.web.WebModule.start(WebModule.java:456)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:922)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:906)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:696)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2205)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1890)
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:85)
at com.sun.enterprise.v3.server.ApplicationLifecycle.start(ApplicationLifecycle.java:560)
at com.sun.enterprise.v3.server.ApplicationLifecycle.start(ApplicationLifecycle.java:547)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:189)
at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:260)
at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:97)
at com.sun.enterprise.v3.server.ApplicationLoaderInjector.postConstruct(ApplicationLoaderInjector.java:61)
at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:150)
at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:90)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:87)
at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:75)
at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:203)
at com.sun.enterprise.v3.server.AppServerStartup$1.run(AppServerStartup.java:116)

------------------------------------------------------------------------------------------------------------
错误信息(2)

严重: PWC2768: IOException while loading persisted sessions: java.io.StreamCorruptedException: unexpected end of block data
java.io.StreamCorruptedException: unexpected end of block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at org.apache.catalina.session.StandardSession.readRemainingObject(StandardSession.java:1835)
at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1767)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at org.apache.catalina.session.StandardSession.deserialize(StandardSession.java:1106)
at org.apache.catalina.session.StandardManager.readSessions(StandardManager.java:513)
at org.apache.catalina.session.StandardManager.doLoadFromFile(StandardManager.java:443)
at org.apache.catalina.session.StandardManager.load(StandardManager.java:413)
at org.apache.catalina.session.StandardManager.start(StandardManager.java:874)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5331)
at com.sun.enterprise.web.WebModule.start(WebModule.java:456)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:922)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:906)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:696)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2205)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1890)
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:85)
at com.sun.enterprise.v3.server.ApplicationLifecycle.start(ApplicationLifecycle.java:560)
at com.sun.enterprise.v3.server.ApplicationLifecycle.start(ApplicationLifecycle.java:547)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:189)
at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:260)
at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:97)
at com.sun.enterprise.v3.server.ApplicationLoaderInjector.postConstruct(ApplicationLoaderInjector.java:61)
at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:150)
at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:90)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:87)
at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:75)
at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:203)
at com.sun.enterprise.v3.server.AppServerStartup$1.run(AppServerStartup.java:116)
严重: PWC2773: Exception loading sessions from persistent storage
java.io.StreamCorruptedException: unexpected end of block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at org.apache.catalina.session.StandardSession.readRemainingObject(StandardSession.java:1835)
at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1767)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at org.apache.catalina.session.StandardSession.deserialize(StandardSession.java:1106)
at org.apache.catalina.session.StandardManager.readSessions(StandardManager.java:513)
at org.apache.catalina.session.StandardManager.doLoadFromFile(StandardManager.java:443)
at org.apache.catalina.session.StandardManager.load(StandardManager.java:413)
at org.apache.catalina.session.StandardManager.start(StandardManager.java:874)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5331)
at com.sun.enterprise.web.WebModule.start(WebModule.java:456)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:922)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:906)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:696)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2205)
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1890)
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:85)
at com.sun.enterprise.v3.server.ApplicationLifecycle.start(ApplicationLifecycle.java:560)
at com.sun.enterprise.v3.server.ApplicationLifecycle.start(ApplicationLifecycle.java:547)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:189)
at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:260)
at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:97)
at com.sun.enterprise.v3.server.ApplicationLoaderInjector.postConstruct(ApplicationLoaderInjector.java:61)
at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:150)
at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:90)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:87)
at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:75)
at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:203)
at com.sun.enterprise.v3.server.AppServerStartup$1.run(AppServerStartup.java:116)

通过观察不难发现,这两个错误都是发生在“loading sessions from persistent storage”之时,也就是从持久化文件还原session的时候。我们都知道Tomcat能够在容器关闭时将session中的数据持久化到文件系统中,待容器重启时将其还原,但前提条件是保存在session中的数据类型均实现了java.io.Serializable接口,glassfish的Servlet容器是基于Tomcat构建的,所以原理基本相同,而且Glassfish是默认开启session持久化的。

于是解决第一个问题的答案就有了:cn.beans.UserSession中的time属性是java.util.Date类型的,而Date没有实现Serializable接口、所以只需创建一个Date的子类令其实现Serializable接口,并将time定义为该子类的对象即可。

而解决第二个问题就需要彻底保证所有保存在session中的数据都是序列化了的才行。当然如果不考虑session持久化就不需要这样做了,只需禁用session持久化功能即可,这一点上tomcat与glassfish略有不同:

1.Tomcat中禁用/启用session持久化:在Tomcat的配置文件server.xml中添加以下内容:

禁用持久化:

<context path="..." reloadable="..." docbase="..." workdir="...">

<manager classname="org.apache.catalina.session.StandardManager">

</manager>

</context>



启用持久化:

<context path="..." reloadable="..." docbase="..." workdir="...">

<manager classname="org.apache.catalina.session.PersistentManager" saveonrestart="true">

</manager>

</context>

2.Glassfish中禁用/启用持久化:Glassfish项目中都有名为sun-web.xml的文件,要禁用session持久化只需在该文件中进行以下配置

<sun-web-app>  
<session-config>
<session-manager>
<manager-properties>
<property name="sessionFilename" value="" />
</manager-properties>
</session-manager>
</session-config>
</sun-web-app>


sessionFilename的值是用来指定一个自定义名称的文件来保存session数据的,而将其设为空值便能够取消session持久化的功能。

参考资料:http://blogs.sun.com/jluehe/entry/how_to_disable_persisting_of

http://my.donews.com/woodstudio/2006/03/05/tomcat-session%E6%8C%81%E4%B9%85%E5%8C%96%E7%9A%84%E9%97%AE%E9%A2%98/

http://forums.sun.com/thread.jspa?threadID=575302

2008年12月25日星期四

[转]显示器调色

为什么要调整显示器?

因为显示器不同于我们看到的印刷品或者实物,它显示的颜色会因为不同的操作系统、不同品牌的显示器和显卡、不同的亮度、不同的对比度、甚至不同的使用环境而产生偏差。所以在做所有的事情之前,我们首先要调整显示器,让它能达到一个相对“生动”的程度。

最简单的显示器颜色调整方法,就是使用Adobe Photoshop的颜色调整功能,在你安装Photoshop的时候,软件会提示你调整显示器。如果你没有安装Photoshop也没关系,下面的方法也能帮助你调整。




上面一幅图像是大辰大学色彩研究会开发的用于调整显示器颜色的调色板,利用该调色板调整显示器的亮度和对比度之后,可以通过显示器观察到鲜明自然的颜色。

亮度/对比度调色板的使用方法:

  1. 关闭室内的所有照明,然后利用显示器的OSD(On Screen Display)功能将亮度(Brightness)和对比度(Contrast)分别调整为 0 和 100。
  2. 调整亮度,直到第1个和第2个色块的边界线出现为止,此时为黑色的亮度较低且色调的变化最为明显的状态。
  3. 打开室内照明,调低对比度值,直到第11个和第12个色块间的边界线变模糊之前的状态。(照明暗的时候,调低对比度使用的话,会减少眼睛的疲劳)
  4. 至此完成了显示器颜色的调整工作。

原文地址:http://www.ddcat.net/sheji/peise/1/menu01_01.htm

2008年11月13日星期四

NetBeans的乱码问题

这两天适用了一下NetBeans6.5 RC2 ,结果遇到了一个看似诡异的问题:部分功能文本乱码,比如起始页中的模块标题、JSP文件、XML文件等都出现乱码。开始我怀疑是编码设置的问题,在Google上搜索的结果也都是这么考虑的,可是NetBeans6.5 并没有设置文件编码的地方,所以从这点出发根本无法解决问题。

后来突然想到了Linux中Swing程序的乱码问题是由字体造成的,于是我便打开工具〉选项〉字体和颜色(如下图) 对所有语言都设置了一个中英文都能正常显示的字体——OK,问题解决。

2008年9月21日星期日

申请Google App Egine

前端时间申请Google App Egine,不知为什么我手机总是收不到确认短信,在网上一搜发现国内很多人都遇到了这种情况。我于是向Google提交了我的问题,便把这事放在了一遍,不过当我今天整理我的Gmail邮箱的时候,在一堆论坛提醒邮件里意外的发现了这封几天前来自Google的邮件:
“标题:Invitation to try Google App Engine
Hello,

You're receiving this email because you indicated you'd had some problems verifying your Google App Engine account using SMS. We just wanted to let you know we've enabled your account--you should be able to create applications now!

To start creating applications with Google App Engine, simply follow this link:

http://appengine.google.com/

Thanks!
The Google App Engine Team

呵呵,看到了吧,我的GAE帐号可以使用了!