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

时间:2015-09-24 23:07:12

标签: java xml eclipse spring maven

我刚接触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文件,但在十六进制编辑器中<?xml之前没有看到任何不可见的字符。它们都指定使用UTF-8编码,我没有看到交替的0字节表示意外的UTF-16编码。行结尾似乎是一致的(只是换行符)。

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

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

更新 根据要求,这是我的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>

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

脑海中浮现出两个问题:为什么错误显示在.java文件而不是。 xml文件?为什么这只是eclipse而不是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 我确实在<?xml使用grep -ERl '^[^=]+<\?xml' .之前在我的工作空间中找到了一些带有字符的eclipse生成的xml文件,忽略了一些嵌入文件行中的xml的eclipse用户首选项。删除多余的字符后,问题仍然存在。

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

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

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

此外,<?xml ... >在没有任何DTD声明的情况下也可以正常工作,因此请继续删除element声明与起始UTF-8之间的注释。删除UTF-8声明。 XMLJava编码Spring的问题非常常见,并非针对{{1}}。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

只需在@SpringBootApplication 后面加上@Primary,删除@Primary 并再次保存