maven 编译后的代码运行时报错 nescaped \ at end of component
javax.naming.InvalidNameException: /META-INF/resources/WEB-INF/???.class unescaped \ at end of component先描述一下情况的发生:1、我的项目中 java 有很多类都是老代码,测试环境jenkins集成maven编译打包,一直以来都没问题,2、最近测试环境换成jdk1.8后,过了一
javax.naming.InvalidNameException: /META-INF/resources/WEB-INF/???.class unescaped \ at end of component
先描述一下情况的发生:
1、我的项目中 java 有很多类都是老代码,测试环境jenkins集成maven编译打包,一直以来都没问题,
2、最近测试环境换成jdk1.8后,过了一段时间,突然有一天,测试环境tomcat启动报异常,javax.naming.InvalidNameException: /META-INF/resources/WEB-INF/???.class unescaped \ at end of component
3、按照异常信息,判断应该是类名是无效的,乱码,应该是编译问题,找到这个类的class文件,类名没问题啊,
4、后来在自己电脑上启动tomcat,发现不报异常,
5、把tomcat下的文件复制到测试环境的tomcat下,测试环境不报异常了,
6、哎,这就奇怪了,于是肯定应该是maven编译的代码有问题
7、本地用maven编译打war包,将war部署到测试环境,启动又报异常
8、可以确定是maven编译的代码启动报错,而本地eclipse里tomcat启动不报错
9、百思不得姐呀!开始问度娘,无意中看到这么一句话:
10、好吧,原因找到了,javac编译检查机制更加严格,那怎么解决呢,
11、打开类没发现问题,只是普通的一个类:
12、其他类都一样,编译都没问题,为什么就这个类有问题呢
13、百思不得姐呀!
14、我就想,既然是这个类有问题,那就看看这个类哪里不规范吧,通常类名后边都要实现 Serializable ,除此之外,其他的觉得并没有什么不妥之处的,那就试试吧:
15、没想到好使了,由此感叹,写代码得规范,当年老师说过,最好加上 Serializable,不听老人言,吃亏在眼前!
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。
好处:
a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。
一.Java序列化接口Serializable的作用:
一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”.
对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。(因为静态static的东西在方法区.)
序列化能把堆内存中的对象的生命周期延长,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了.(存储到硬盘是一个文件,不需要我们去解析,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管. 我们只需要读取). 把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.object).
什么样的数据会进行序列化到硬盘进行持久化?
①在很多框架中就会有这种.object结尾的文件,因为很多对象都不创建,创建起来太麻烦,直接读取,而且有些对象的值你不知道,框架封存在.object文件中,直接读取这个文件中的这个值就行了,不需要传这个值.
在搞web开发的时候一些类就需要实现序列化接口,因为服务器就会对你的对象进行临时本地存储.它怕服务器崩了的以后,你的会话都被消失了.所以存储在了硬盘上,你重新启动服务器会恢复之前的会话,恢复对象,你之前运行的东西都在.
②对某些特点的对象,比如数据库连接对象,存储特定数据的对象 ,这样对象你不想创建他们,想存储起来,让他们的生命周期延长,可以把他们放在硬盘当中.每次系统启动的时候都到.object中读取对象和里面的数据,这个时候就可以把他们序列化来完成.
更多推荐
所有评论(0)