2015-09-24 16 views
6

Tôi mới dùng Spring và bắt đầu sử dụng Sprint Tool Suite (nhật thực) và xem lỗi này trong tệp java trong dự án maven của tôi: "Nội dung không được phép trong prolog". Điều này ngăn cản các lớp biên dịch (mà chỉ là một lớp SpringBootApplication tối thiểu) trong nhật thực.Tệp Java: Nội dung không được phép trong prolog

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

Tôi đã xóa web và thấy rằng trong hầu hết mọi tham chiếu, đây là lỗi phân tích cú pháp XML. Tôi đã cập nhật ba tệp XML nhưng không thấy bất kỳ ký tự vô hình nào trước <?xml trong trình chỉnh sửa hex. Tất cả chúng đều chỉ định sử dụng mã hóa UTF-8 và tôi không thấy xen kẽ 0 byte cho biết mã hóa UTF-16 ngẫu nhiên. Các kết thúc dòng có vẻ phù hợp (chỉ là một nguồn cấp dữ liệu dòng).

Thật thú vị, nó xây dựng mà không có lỗi trình biên dịch với "cài đặt sạch maven". Tôi không thấy bất kỳ ký tự đặc biệt nào trong tệp java, nhưng nhật thực cho tôi biết rằng tệp đó là vấn đề và đó là vấn đề về đậu mùa xuân. Thông báo lỗi hiển thị trên dòng đầu tiên với câu lệnh gói.

Bất kỳ ý tưởng nào về vấn đề gốc hoặc cách tôi có thể giải quyết vấn đề này?

Cập nhật Theo yêu cầu, đây là tập tin pom.xml của tôi:

<?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> 

Cập nhật 2 Tôi đã tìm kiếm thư mục dự án của tôi cho tất cả các file .xml và đã gỡ bỏ tất cả các ký tự vô hình lập trình sử dụng perl -i -pe 's/[^\x20-\x7f\x0A\x09]//g' fileName, nhưng không có nhân vật vô hình. Điều này xác nhận những gì tôi thấy trong trình soạn thảo hex.

Hai câu hỏi cần lưu ý: Tại sao lỗi hiển thị trong tệp .java thay vì a. tệp xml? Tại sao đây chỉ là một vấn đề cho nhật thực và không phải là maven?

Nhật ký thực hiện thông điệp này (mà chỉ một file .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) 

Cập nhật 3 tôi đã tìm thấy một số file xml nhật thực tạo ra trong không gian làm việc của tôi với các nhân vật trước khi sử dụng <?xmlgrep -ERl '^[^=]+<\?xml' . để bỏ qua một số prefs người dùng nhật thực có xml được nhúng trong các dòng của tệp. Sau khi loại bỏ các nhân vật phụ, vấn đề vẫn còn mặc dù.

Hãy nghĩ rằng tôi có thể khởi động lại dự án và sao chép từng tệp một.

+1

Khá xa vời, nhưng có thể nó liên quan đến ngắt dòng từ Windows sang Unix? Điều này có thể xảy ra nếu ai đó đã lưu tệp trên Windows và sau đó mở tệp trên Unix. Bạn có thể sửa nó bằng cách chạy dos2unix. –

+0

Bạn đã kiểm tra [Nội dung Eclipse không được phép trong prolog] (http://stackoverflow.com/questions/5445143/eclipse-content-is-not-allowed-in-prolog)? –

+0

@Elliott Frisch Tôi đã đăng pom.xml của mình – rimsky

Trả lời

7

Dường như thủ phạm là không gian làm việc nhật thực bị hỏng. Tôi tạo ra một không gian làm việc mới và nhập khẩu các dự án và tất cả mọi thứ hoạt động tốt. Điều đó cũng sẽ giải thích lý do tại sao một maven xây dựng bên ngoài đã không hiển thị bất kỳ vấn đề.

Như đã lưu ý trong bản cập nhật 3, tôi đã tìm thấy một số tệp xml được tạo nhật thực có các ký tự trước prolog. Mặc dù sửa chữa những lỗi đó không khắc phục được sự cố, tôi đã không kiểm tra mọi tập tin nhật thực với nội dung xml (như các prefs của người dùng) để xem chúng có một số ký tự ẩn trước prolog hay không.

Không biết điều gì sẽ khiến nó bị hỏng, ngoại trừ có lẽ lực lượng bỏ nhật thực trong một bản cập nhật repo maven không hồi đáp nhưng tôi không thể chắc chắn nếu đó là rắc rối của tôi bắt đầu. Tôi chỉ vui vì tôi có thể tiến lên phía trước.

+0

Tôi đã xóa toàn bộ nội dung ... server.core của Eclipse và nó cũng hoạt động. – user435421

3

Rất có thể lỗi được tạo bởi UTF-8BOM khi bắt đầu tệp XML - các ứng dụng như Notepad đặt ở đầu tệp và luồng Java không thể xử lý tự động. XML của bạn là chính xác nhưng tệp không được mã hóa UTF-8. Tôi đã nhìn thấy điều này trước khi .. thử sao chép và dán XML từ diễn đàn này vào một trình soạn thảo văn bản và lưu nó. Ngoài ra hãy chắc chắn rằng bạn đang soạn thảo văn bản thực sự tiết kiệm trong UTF-8.

Ngoài ra, Spring sẽ chỉ làm việc tốt mà không khai báo bất kỳ <?xml ... > nên đi trước và loại bỏ các bình luận giữa DTD khai và bắt đầu element. Xóa tuyên bố UTF-8.Sự cố với UTF-8 được mã hóa XML trong Java khá phổ biến và không cụ thể cho Spring.

+0

Cảm ơn các đề xuất nhưng chúng không hoạt động. – rimsky

1

Trong trường hợp của tôi, lỗi này xảy ra khi tôi đổi tên thành lớp chính (lớp được chú thích bằng @SpringBootApplication) của ứng dụng springboot. Tôi không có nghĩa là điều này sẽ luôn xảy ra nhưng tôi vô tình nhận được lỗi này sau khi đổi tên tệp lớp này trong STS 3.8.4.

Để giải quyết vấn đề này, tôi đã đóng IDE, điều hướng đến thư mục dự án và xóa tệp .springBeans. Sau khi mở lại IDE, lỗi này đã biến mất và IDE của tôi không còn phàn nàn về điều này nữa.

+1

+1 Đây là những gì đã giúp tôi. Xóa tập tin bean mùa xuân, dọn dẹp dự án, đóng lại và mở lại. – Calebj

Các vấn đề liên quan