最近用到maven-war-plugin这个插件来进行打包,但是打完包启动tomcat会遇到这个报错:
- org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [D:\apache-tomcat-7.0.63_eclipse\webapps\Merchant\WEB-INF\classes\config\applicationContext-db.xml]; nested exception is com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
- at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:410)
- at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
- at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
- at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
- at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
- at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
- at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
- at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
- at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
- at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:604)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:509)
- at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
- at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
- at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
- at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5017)
- at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5531)
- at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
- at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
- at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
- at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
- at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1095)
- at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1930)
- at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
- at java.util.concurrent.FutureTask.run(FutureTask.java:262)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
- at java.lang.Thread.run(Thread.java:744)
- Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
- at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687)
- at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:435)
- at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
- at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(XMLEntityScanner.java:1252)
- at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanComment(XMLScanner.java:778)
- at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanComment(XMLDocumentFragmentScannerImpl.java:1038)
- at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2972)
- at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
- at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
- at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
- at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
- at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
- at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
- at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
- at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347)
- at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
- at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
- at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
- ... 26 more
就是报
- 3 字节的 UTF-8 序列的字节 3 无效
我确认了一下我XML文件的编码:
- <?xml version="1.0" encoding="UTF-8"?>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
想到可能是maven-war-plugin的问题
google一下,查找了一下源码:
发下了一个巨大无比的坑
if ( context.getWebappStructure().registerFile( sourceId, targetFilename ) )
{
final File targetFile = new File( context.getWebappDirectory(), targetFilename );
try
{
// fix for MWAR-36, ensures that the parent dir are created first
targetFile.getParentFile().mkdirs();
// TODO: add encoding support (null mean platform encoding)
context.getMavenFileFilter().copyFile( file, targetFile, true, context.getFilterWrappers(), null );
}
catch ( MavenFilteringException e )
{
throw new MojoExecutionException( e.getMessage(), e );
}
// Add the file to the protected list
context.getLog().debug( " + " + targetFilename + " has been copied (filtered)." );
return true;
}
else
{
context.getLog().debug(
" - " + targetFilename + " wasn't copied because it has already been packaged (filtered)." );
return false;
}
}
看到没有!!
- context.getMavenFileFilter().copyFile( file, targetFile, true, context.getFilterWrappers(), null );
而win环境默认是GBK,所以会乱码了。。。而且win不像Linux可以随意更改系统默认编码!!!所以用这个插件打包,有中文就坑了。。。。。
目前的解决办法是去掉注释中的中文。
2.尝试在pom.xml加入如下配置:
- <build>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <configuration>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- </plugins>
- </build>