Java文件:prolog中不允许的内容

我是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); } } 

我已经浏览了网页,并且几乎在每个引用中都看到了这一点,这是一个XML解析错误。 我一直在更新三个XML文件,但在hex编辑器中的<?xml之前没有看到任何不可见的字符。 它们都指定使用UTF-8编码,我没有看到交替的0字节表示意外的UTF-16编码。 行结尾似乎一致(只是换行)。

有趣的是,它使用“maven clean install”在没有编译器错误的情况下构建。 我在java文件中也没有看到任何特殊字符,但是eclipse告诉我文件是问题而且这是一个spring bean问题。 错误消息显示在第一行的package语句中。

任何想法根本问题是什么或如何解决这个问题?

更新根据要求,这是我的pom.xml文件:

   4.0.0 org.springframework gs-rest-service 0.1.0  org.springframework.boot spring-boot-starter-parent 1.2.5.RELEASE    org.springframework.boot spring-boot-starter-web   org.mybatis mybatis 3.2.8   mysql mysql-connector-java    1.8     org.springframework.boot spring-boot-maven-plugin     com/test/mybatis/mappers src/main/java/com/test/mybatis/mappers  *.xml    src/main/resources      spring-releases https://repo.spring.io/libs-release     spring-releases https://repo.spring.io/libs-release      mysql mysql-connector-java 5.1.36     

更新2我搜索了我的项目文件夹中的所有.xml文件,并使用perl -i -pe 's/[^\x20-\x7f\x0A\x09]//g' fileName编程方式删除了所有不可见的字符,但没有看不见的角色。 这证实了我在hex编辑器中看到的内容。

我想到两个问题:为什么错误显示在.java文件而不是。 xml文件? 为什么这只是日食而不是maven的问题?

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) 

更新3我确实在我的工作区中找到了一些eclipse生成的xml文件,其中包含<?xml之前使用grep -ERl '^[^=]+<\?xml' .字符grep -ERl '^[^=]+<\?xml' . 它忽略了一些eclipse用户prefs,它们在文件的行中嵌入了xml。 删除多余的字符后,问题仍然存在。

我想我可以重新启动项目并一次复制一个文件。

罪魁祸首似乎是一个腐败的日食工作区。 我创建了一个新工作区并导入了项目,一切正常。 这也可以解释为什么外部maven构建没有出现任何问题。

如更新3中所述,我发现了一些eclipse生成的xml文件,这些文件在prolog之前有字符。 虽然纠正这些并没有解决问题,但是我没有检查每个带有xml内容的eclipse文件(比如用户prefs),看看它们是否在prolog之前有一些不可见的字符。

不知道是什么会导致它被腐蚀,除非在一个反应​​迟钝的maven repo更新期间强制戒掉日食,但我无法确定是否那是我的麻烦开始的时候。 我很高兴我能继续前进。

最有可能的错误是由XML文件开头的UTF-8 BOM生成的 – 像Notepad这样的应用程序将它放在文件的开头,Java流无法自动处理。 您的XML是正确的,但该文件不是UTF-8编码。 我以前见过这个..尝试将XML从这个论坛复制并粘贴到文本编辑器中并保存。 还要确保你的文本编辑器真的保存在UTF-8

此外, Spring将在没有任何声明的情况下正常工作,因此请继续删除DTD声明和起始element之间的注释。 删除UTF-8声明。 在Java中使用UTF-8编码的XML问题非常常见,并不是特定于Spring

在我的情况下,当我重命名springboot应用程序的主类(使用@SpringBootApplication注释的类)时发生此错误。 我并不是说这总是会发生,但在STS 3.8.4中重命名这个类文件后,我意外地遇到了这个错误。

要解决此问题,我关闭了IDE,导航到项目文件夹并删除了.springBeans文件。 重新打开IDE后,此错误消失了,我的IDE不再抱怨这一点。

对我来说,这是因为我重命名了一些类,而.springBeans文件需要一些手动编辑。