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后,过了一段时间,突然有一天,测试环境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中读取对象和里面的数据,这个时候就可以把他们序列化来完成.



  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Idea的设计初衷是为了提供一个集成化的开发环境,方便开发者进行代码编写、调试和测试。在Idea中,代码的语法错误会在实时编译过程中被捕捉到,并在编辑器中显示错误的具体位置和描述信息。因此,如果你在Idea中打开一个项目时没有报错,说明该项目的代码语法是正确的,Idea可以正确识别并编译这些代码。 而与此不同,Maven是Java项目的构建工具,它通过读取项目的pom.xml文件来管理依赖以及执行编译、运行测试等任务。Maven编译过程中会对代码进行更严格的检查,包括检查依赖关系、代码的正确性以及重复等问题。如果你在使用Maven编译项目时报错,说明你的项目存在一些与编译或依赖相关的问题。 有两种可能的情况会导致Maven编译报错。一种是你pom.xml文件中的配置有误,例如依赖的坐标错误、版本不匹配等。另一种可能是你的代码存在一些错误或不规范的地方,例如语法错误、缺少必要的注解或方法等。 为了解决Maven编译报错,你可以仔细检查pom.xml文件的配置,确认依赖的坐标、版本和范围是否正确。同时,你还可以通过阅读Maven编译报错信息中的具体错误提示,找到造成编译错误的代码位置,并进行相应的修正。在修正时,你可以借助Idea的实时编译功能,在代码编辑器中实时显示错误,以便更快地定位和解决问题。 总之,Idea的打开不报错Maven编译报错之间的差异是由于它们对代码的检查标准和方式不同所致。通过仔细检查配置和修正代码,你能够解决Maven编译报错问题,使得项目能够顺利地构建和运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值