【发布时间】: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 文件,这些文件在 <?xml 之前使用 grep -ERl '^[^=]+<\?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