【问题标题】:Java file: Content not allowed in prologJava 文件:序言中不允许的内容
【发布时间】:2015-12-22 16:56:43
【问题描述】:

我是 Spring 新手,开始使用 Sprint Tool Suite (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 问题。错误消息显示在 package 语句的第一行。

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

更新 根据要求,这是我的 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 文件中而不是 a.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 我确实在我的工作区中找到了一些 eclipse 生成的 xml 文件,这些文件在 &lt;?xml 之前使用 grep -ERl '^[^=]+&lt;\?xml' . 忽略了一些在文件行中嵌入了 xml 的 eclipse 用户首选项。删除多余的字符后,问题仍然存在。

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

【问题讨论】:

  • 有点牵强,但也许它与从 Windows 到 Unix 的换行符有关?如果有人在 Windows 上保存文件然后在 unix 上打开它,就会发生这种情况。你可以通过运行 dos2unix 来修复它。
  • @Elliott Frisch 我发布了我的 pom.xml
  • @Mick Mnemonic 是的,.springBeans 文件看起来很有希望,因为该技巧适用于 java 文件,并且 .springBeans 在配置部分(没有其他内容)而不是在自动配置部分。然而,当我将该配置行移至自动配置部分时,结果仍然相同。删除 .springBeans 文件后结果也相同。
  • 也许你在 pom.xml(或其他 XML 文件)的开头有一个 byte-order-mark。 BOM 可能仅在十六进制编辑器中显示。

标签: java xml eclipse spring maven


【解决方案1】:

罪魁祸首似乎很可能是损坏的 Eclipse 工作区。我创建了一个新工作区并导入了项目,一切正常。这也可以解释为什么外部 maven 构建没有显示任何问题。

如更新 3 中所述,我发现一些 eclipse 生成的 xml 文件在序言之前有字符。尽管更正这些并不能解决问题,但我并没有检查每个带有 xml 内容的 eclipse 文件(如用户首选项)以查看它们在序言之前是否有一些不可见的字符。

不知道什么会导致它被损坏,除了在无响应的 maven repo 更新期间可能强制退出 eclipse,但我不能确定那是否是我的麻烦开始的时候。我很高兴我能继续前进。

【讨论】:

  • 我已经删除了整个 Eclipse 的 ...server.core 内容,它也有效。
【解决方案2】:

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

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

【讨论】:

  • +1 这对我有帮助。删除spring beans文件,清理项目,关闭再重新打开。
  • @cataclysm 感谢您的解决方案。我遇到了同样的情况,按照上述步骤操作后一切正常。
  • 感谢您的解决方案。我有同样愚蠢的问题。似乎是由重命名 Application.java 类引起的。删除 .springbeans 是不够的;必须删除 Application.java 文件并创建一个新文件。 Spring Tool Suite 3,版本:3.9.10.RELEASE
【解决方案3】:

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

此外,Spring 在没有任何 &lt;?xml ... &gt; 声明的情况下也可以正常工作,因此请继续删除 DTDdeclaration 和起始 element 之间的注释。删除 UTF-8declaration。 UTF-8encoded XMLin Java 的问题很常见,并非特定于 Spring

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • .springBeans 文件需要什么样的手动编辑?具体一点。
    【解决方案5】:

    只需将@Primary 放在@SpringBootApplication 之后,删除@Primary 并再次保存

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 2023-03-13
      • 2023-04-10
      • 2014-07-23
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      相关资源
      最近更新 更多