I'm new to Spring and started using the Sprint Tool Suite (eclipse) and see this error in a java file in my maven project: "Content is not allowed in prolog". This prevents the class from compiling (which is just a minimal SpringBootApplication class) in eclipse.
我是Spring的新手,开始使用Sprint工具套件(eclipse),并在我的maven项目的java文件中看到这个错误:“prolog中不允许有内容”。这将阻止类在eclipse中编译(这只是一个最小的SpringBootApplication类)。
package com.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
I've scoured the web and saw that in virtually every reference, this is an XML-parsing error. I had been updating three XML files but didn't see any invisible characters before the <?xml
in a hex editor. They all specify to use UTF-8 encoding and I'm not seeing alternating 0 bytes that would indicate an accidental UTF-16 encoding. The line endings seem consistent (just a line feed).
我搜索了web,发现在几乎所有引用中,这是一个xml解析错误。我一直在更新三个XML文件,但是在
Interestingly, it builds without compiler errors with "maven clean install". I don't see any special characters in the java file either, but eclipse tells me that file is the problem and that's it a spring beans problem. The error message shows on the first line with the package statement.
有趣的是,它使用“maven clean install”构建时没有编译错误。我在java文件中也没有看到任何特殊字符,但是eclipse告诉我这个文件就是问题所在,这就是spring beans的问题。错误消息显示在包语句的第一行。
Any ideas what the root problem is or how I can solve this?
你知道根本问题是什么或者我该怎么解决?
Update As requested, here's my pom.xml file:
按要求更新,这是我的pom。xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-rest-service</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<targetPath>com/test/mybatis/mappers</targetPath>
<directory>src/main/java/com/test/mybatis/mappers</directory>
<includes>
<include>*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Update 2 I searched my project folder for all .xml files and have removed all invisible characters programmatically using perl -i -pe 's/[^\x20-\x7f\x0A\x09]//g' fileName
, but there were no invisible characters. This confirms what I saw in the hex editor.
更新2我搜索我项目文件夹中的所有xml文件并删除所有不可见字符以编程方式使用perl - pe ' s /[^ \ x20的——\ x7f \ x0A \ x09]/ / g的文件名,但是没有看不见的字符。这证实了我在十六进制编辑器中看到的。
Two questions come to mind: Why is the error showing in a .java file instead of a. xml file? Why is this only a problem for eclipse and not maven?
我想到了两个问题:为什么错误显示在.java文件而不是. xml文件中?为什么这只是eclipse的问题,而不是maven的问题?
The eclipse log shows this message (which indicates a .xml file):
eclipse日志显示了这条消息(它指示一个.xml文件):
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.springframework.ide.eclipse.core.io.xml.XercesDocumentLoader.loadDocument(XercesDocumentLoader.java:48)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$2.loadBeanDefinitions(BeansConfig.java:397)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$3.call(BeansConfig.java:456)
at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$3.call(BeansConfig.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Update 3 I did find some eclipse-generated xml files in my workspace with characters before the <?xml
using grep -ERl '^[^=]+<\?xml' .
which ignores some of the eclipse user prefs which have xml embedded in the lines of the file. After removing the extra characters, the problem remained though.
更新3我确实在我的工作空间中找到了一些eclipse生成的xml文件,其中包含
Think I may restart the project and copy over files one at a time.
我想我可以重新启动这个项目,一次复制一个文件。
4 个解决方案
#1
7
It seems likely that the culprit was a corrupted eclipse workspace. I created a new workspace and imported the project and everything works fine. That would also explain why an external maven build didn't show any problems.
似乎罪魁祸首是一个损坏的eclipse工作区。我创建了一个新的工作空间并导入了这个项目,一切正常。这也可以解释为什么外部maven构建没有显示任何问题。
As noted in update 3, I had found some eclipse-generated xml files that had characters before the prolog. Although correcting those did not fix the problems, I didn't inspect every eclipse file with xml content (like the user prefs) to see if they had some invisible characters before the prolog.
正如更新3中所指出的,我发现了一些eclipse生成的xml文件,它们在prolog之前有字符。虽然纠正这些问题并没有解决问题,但是我没有检查每个eclipse文件,其中包含xml内容(比如用户prefs),看看它们是否在prolog之前有一些不可见的字符。
Don't know what would have caused it to be corrupted except for perhaps force quitting eclipse during an unresponsive maven repo update but I can't be certain if that's when my troubles started. I'm just glad I can move forward.
不知道是什么原因导致它被损坏,除了可能在maven repo更新时强制退出eclipse之外,但我不能确定这是否是我的麻烦开始的时候。我很高兴我能继续前进。
#2
3
Most likely the error was generated by the UTF-8
BOM
at the start of the XML
file - applications like Notepad
puts that at the start of the file and the Java streams cannot handle that automatically. Your XML
is correct, but the file is not UTF-8
Encoded. I've seen this before.. try copying and pasting the XML from this forum into a text editor and saving it. Also make sure that you're text editor is really saving in UTF-8
.
最可能的错误是由UTF-8 BOM在XML文件的开头生成的——像Notepad这样的应用程序将错误放在文件的开头,而Java流无法自动处理这些错误。您的XMLis是正确的,但是文件不是utf -8编码的。我以前见过这个. .尝试将这个论坛的XML复制并粘贴到一个文本编辑器中并保存它。还要确保你的文本编辑器保存在UTF-8中。
Also, Spring
will work just fine without any <?xml ... >
declaration so go ahead and remove the comment between the DTD
declaration and the starting element
. Remove the UTF-8
declaration. Problems with UTF-8
encoded XML
in Java
are pretty common, and not specific to Spring
.
而且,Springwill在没有任何 声明,因此继续并删除DTDdeclaration和起始元素之间的注释。删除UTF-8declaration。使用utf -8编码的XMLin Java的问题非常常见,而且不是Spring特有的。
#3
1
In my case this error occured while I was renamed main class (class annotated with @SpringBootApplication) of springboot application. I don't mean this will always happen but I accidently got this error after rename this class file in STS 3.8.4.
在我的例子中,当我被重命名为springboot应用程序的主类(用@SpringBootApplication注释的类)时发生了这个错误。我并不是说这种情况会经常发生,但是我在STS 3.8.4中重命名了这个类文件后意外地得到了这个错误。
To resolve this issue, I closed the IDE, navigate to project folder and delete the .springBeans
file. After reopened IDE, this error was gone and my IDE no longer complains about this.
为了解决这个问题,我关闭了IDE,导航到项目文件夹并删除. springbeans文件。在重新打开IDE之后,这个错误就消失了,我的IDE也不再对此抱怨。
#4
0
For me it was because I had renamed some classes and the .springBeans file needed some manual editing.
对我来说,这是因为我重命名了一些类,而. springbeans文件需要一些手工编辑。
#1
7
It seems likely that the culprit was a corrupted eclipse workspace. I created a new workspace and imported the project and everything works fine. That would also explain why an external maven build didn't show any problems.
似乎罪魁祸首是一个损坏的eclipse工作区。我创建了一个新的工作空间并导入了这个项目,一切正常。这也可以解释为什么外部maven构建没有显示任何问题。
As noted in update 3, I had found some eclipse-generated xml files that had characters before the prolog. Although correcting those did not fix the problems, I didn't inspect every eclipse file with xml content (like the user prefs) to see if they had some invisible characters before the prolog.
正如更新3中所指出的,我发现了一些eclipse生成的xml文件,它们在prolog之前有字符。虽然纠正这些问题并没有解决问题,但是我没有检查每个eclipse文件,其中包含xml内容(比如用户prefs),看看它们是否在prolog之前有一些不可见的字符。
Don't know what would have caused it to be corrupted except for perhaps force quitting eclipse during an unresponsive maven repo update but I can't be certain if that's when my troubles started. I'm just glad I can move forward.
不知道是什么原因导致它被损坏,除了可能在maven repo更新时强制退出eclipse之外,但我不能确定这是否是我的麻烦开始的时候。我很高兴我能继续前进。
#2
3
Most likely the error was generated by the UTF-8
BOM
at the start of the XML
file - applications like Notepad
puts that at the start of the file and the Java streams cannot handle that automatically. Your XML
is correct, but the file is not UTF-8
Encoded. I've seen this before.. try copying and pasting the XML from this forum into a text editor and saving it. Also make sure that you're text editor is really saving in UTF-8
.
最可能的错误是由UTF-8 BOM在XML文件的开头生成的——像Notepad这样的应用程序将错误放在文件的开头,而Java流无法自动处理这些错误。您的XMLis是正确的,但是文件不是utf -8编码的。我以前见过这个. .尝试将这个论坛的XML复制并粘贴到一个文本编辑器中并保存它。还要确保你的文本编辑器保存在UTF-8中。
Also, Spring
will work just fine without any <?xml ... >
declaration so go ahead and remove the comment between the DTD
declaration and the starting element
. Remove the UTF-8
declaration. Problems with UTF-8
encoded XML
in Java
are pretty common, and not specific to Spring
.
而且,Springwill在没有任何 声明,因此继续并删除DTDdeclaration和起始元素之间的注释。删除UTF-8declaration。使用utf -8编码的XMLin Java的问题非常常见,而且不是Spring特有的。
#3
1
In my case this error occured while I was renamed main class (class annotated with @SpringBootApplication) of springboot application. I don't mean this will always happen but I accidently got this error after rename this class file in STS 3.8.4.
在我的例子中,当我被重命名为springboot应用程序的主类(用@SpringBootApplication注释的类)时发生了这个错误。我并不是说这种情况会经常发生,但是我在STS 3.8.4中重命名了这个类文件后意外地得到了这个错误。
To resolve this issue, I closed the IDE, navigate to project folder and delete the .springBeans
file. After reopened IDE, this error was gone and my IDE no longer complains about this.
为了解决这个问题,我关闭了IDE,导航到项目文件夹并删除. springbeans文件。在重新打开IDE之后,这个错误就消失了,我的IDE也不再对此抱怨。
#4
0
For me it was because I had renamed some classes and the .springBeans file needed some manual editing.
对我来说,这是因为我重命名了一些类,而. springbeans文件需要一些手工编辑。