请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

jeesite

 找回密码
 注册新会员
查看: 118|回复: 0

[处理中] maven 编译后的代码运行时报错 nescaped \ at end of component

[复制链接]
admin 发表于 2018-5-29 21:44:44 | 显示全部楼层 |阅读模式

https://blog.csdn.net/zhang_dianliang/article/details/79173560
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中读取对象和里面的数据,这个时候就可以把他们序列化来完成.
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|手机版|小黑屋|Archiver|jeesite 官方论坛. ( 吉ICP备12004769号  

GMT+8, 2018-6-19 22:13 , Processed in 0.109375 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表