Spring schemaLocation không thành công khi không có kết nối internet


107

Tôi đang sử dụng Spring và trong application-context.xmltôi có các định nghĩa sau:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:util="http://www.springframework.org/schema/util"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://www.springframework.org/schema/util 
   http://www.springframework.org/schema/util/spring-util-2.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-2.1.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
   http://www.springframework.org/schema/security
   http://www.springframework.org/schema/security/spring-security-2.0.xsd"
   >

.....

Khi kết nối Internet của tôi bị mất, tôi không thể chạy ứng dụng của mình qua tomcat hoặc cầu cảng.

Nó cho:

[main] WARN  org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Ignored XML validation warning
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document '/spring-beans-2.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.warning(ErrorHandlerWrapper.java:96)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:380)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2541)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaWarning(XSDHandler.java:2532)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:1836)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:531)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.findSchemaGrammar(XMLSchemaValidator.java:2408)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1753)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:115)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:441)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:383)
    at org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:210)
    at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:184)
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:483)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:553)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:523)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:356)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
2009-11-13 15:31:25,675 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 23 in XML document from class path resource [application-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinit........

Bất kỳ đề xuất làm thế nào để sửa chữa nó?

Câu trả lời:


115

Không cần sử dụng giao thức classpath: trong URL schemaLocation của bạn nếu không gian tên được định cấu hình chính xác và tệp XSD nằm trên classpath của bạn.

Spring doc " Đăng ký trình xử lý và lược đồ " cho biết cách nó nên được thực hiện.

Trong trường hợp của bạn, vấn đề có thể là jar-context jar trên classpath của bạn không phải là 2.1. Đó là lý do tại sao việc thay đổi giao thức thành classpath: và đưa XSD 2.1 cụ thể vào classpath của bạn đã khắc phục được sự cố.

Từ những gì tôi đã thấy, có 2 lược đồ được xác định cho XSD chính được chứa trong một bình spring- *. Một lần để giải quyết URL lược đồ có phiên bản và một lần không có nó.

Ví dụ, xem phần này của nội dung spring.schemas trong spring-context-3.0.5.RELEASE.jar:

http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd
http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.0.xsd

Điều này có nghĩa là (trong xsi: schemaLocation)

http://www.springframework.org/schema/context/spring-context-2.5.xsd 

sẽ được xác thực chống lại

org/springframework/context/config/spring-context-2.5.xsd 

trong classpath.

http://www.springframework.org/schema/context/spring-context-3.0.xsd 

hoặc là

http://www.springframework.org/schema/context/spring-context.xsd

sẽ được xác thực chống lại

org/springframework/context/config/spring-context-3.0.xsd 

trong classpath.

http://www.springframework.org/schema/context/spring-context-2.1.xsd

không được xác định nên Spring sẽ tìm kiếm nó bằng cách sử dụng URL theo nghĩa đen được xác định trong schemaLocation.


37
Đối với những người cần tóm tắt: Spring không thể tìm thấy các lược đồ trong classpath. JAR lõi mùa xuân có ánh xạ tên tệp> lược đồ được bao gồm trong JAR. Nếu nó không thể giải quyết điều này, nó sẽ chuyển đến trang web.
Alex,

Tôi đã khai báo nó như thế này "http:////www.springframework.org/schema/context http: ///www.springframework.org/schema/context/spring-context-4.0.xsd". Tôi có lọ 4.0 trong Glassfish / domains / domain1 / lib. Bất cứ khi nào tôi triển khai dự án, glassfish đề cập đến internet. Vấn đề này có cụ thể đối với glassfish-4.0 không? (bổ sung thêm '/' s để định dạng)
Pragalathan M

Tôi nghĩ liên kết "Đăng ký trình xử lý và giản đồ" mới sẽ ở đây: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

1
@Dirk - liên kết xuất hiện để bị phá vỡ
Stormcloud

2
@Stormcloud, vâng, liên kết ban đầu dường như đã quay trở lại và liên kết mà tôi đề xuất đã bị hỏng. Đây là liên kết tài liệu mới nhất: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

28

Tôi đã giải quyết nó

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-2.0.xsd
       http://www.springframework.org/schema/context
       classpath:spring-context-2.1.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-2.0.xsd"
       >

classpath:spring-context-2.1.xsdlà chìa khóa để làm việc ở chế độ ngoại tuyến (không có kết nối internet). Ngoài ra, tôi đã sao chép spring-context-2.1.xsdgần (cùng một thư mục) tệp application-context.xml


6
Đối với những người dùng intellij có thể gặp phải điều này. Điều này hoạt động ngay cả khi intellij không nhận ra cú pháp classpath bên trong schemalLocation và đánh dấu nó là một lỗi.
Upgradingdave

Xin gửi lời cảm ơn sâu sắc tới @DaveParoulek - lỗi đã khiến tôi khó chịu nhưng điều này hoàn toàn không phải là mẹo.
Zach Johnson

18

Một cái gì đó như thế này đã làm việc cho tôi.

xsi:schemaLocation=
"http://www.springframework.org/schema/beans 
             classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
             classpath:org/springframework/beans/factory/xml/spring-context-3.0.xsd"

1
Có, điều này hoạt động vì xsd được đóng gói bên trong bình mùa xuân. Vì vậy, không cần phải kiểm tra trên springframework.com khi bạn có thể sử dụng xsd bên trong lọ :)
Somaiah Kumbera

Giải pháp này phù hợp với tôi bởi vì tôi có sự phụ thuộc vào mùa xuân bên trong một cái lọ, tôi có nghĩa là một cái lọ bên ngoài và không có internet thì giải pháp của bạn đã hoạt động rất tốt đối với tôi, cảm ơn rất nhiều thần phù hộ.
chiperortiz

@godlikeNoob Tôi đã thử điều này nhưng nó lại xuất hiện lỗi "cvc-elt.1: Không thể tìm thấy khai báo của phần tử 'bean'."
Kamini

6

Trong trường hợp bất kỳ ai đến đây thông qua cùng một thư mục gốc mà tôi đã làm - tôi gặp phải vấn đề này vì tôi đang xây dựng một JAR duy nhất với tất cả các phụ thuộc, bao gồm cả Spring JAR. Kết quả là tệp spring.schemas trong một số thư mục META-INF của Spring JARs đã bị ghi đè.

Tôi đã tìm thấy các giải pháp được đề xuất ở đây: Làm thế nào để tạo jar thực thi dựa trên mùa xuân với maven?


5

Ran vào một vấn đề tương tự ngày hôm nay. Trong trường hợp của tôi, chính plugin bóng râm là thủ phạm, ngoài việc springframework.org bị ngừng hoạt động. Đoạn mã sau đã làm sáng tỏ mọi thứ:

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
   <resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
    <resource>META-INF/spring.handlers</resource>
</transformer>

HTH ai đó


đoạn mã trên cần thêm vào đâu?
Kamini

4

Bạn nên kiểm tra xem tệp spring.handlersspring.schemastệp có trên đường dẫn classpath và có nội dung phù hợp hay không.

Điều này có thể được thực hiện với ClassLoader.getResource(..). Bạn có thể chạy phương pháp với trình gỡ lỗi từ xa trong môi trường thời gian chạy. Thiết lập tác giả XML có thể mở rộng được mô tả trong Spring Reference B.5. Đăng ký trình xử lý và lược đồ .

Thông thường, các tệp phải ở trong spring jar (springframework.jar / META-INF /) và trên classpath khi Spring có thể được khởi chạy.


1
xin chào, giải pháp của bạn rất phức tạp; tôi không hiểu ý bạn là gì? jroller.com/marshbourdon/entry/using_spring_2_x_xml , tôi đã thử cách này nhưng không hiệu quả. Bất kỳ đề xuất ? Không thể phức tạp để làm việc một ứng dụng web trong khi không có kết nối internet. tôi nói đúng chứ? Cảm ơn.
Altug

1
Mùa xuân nên làm việc ra khỏi hộp. Có gì đó với đường dẫn classpath của bạn không chính xác. Câu trả lời của tôi chỉ chứa một số gợi ý để phân tích vấn đề của bạn.
Thomas Jung,

2

Tìm đường dẫn lớp

Nếu bạn đang sử dụng nhật thực, hãy nhấp vào tệp jar tương ứng. Goto -> META-INF-> mở tệp spring.schemas

bạn sẽ thấy những dòng giống như bên dưới.

http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.1.xsd

copy after = và cấu hình bean giống như bên dưới.

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/rabbit classpath:org/springframework/amqp/rabbit/config/spring-rabbit-1.1.xsd http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.1.xsd http://www.springframework.org/schema/context classpath:org/springframework/context/config/spring-context-3.1.xsd http://www.springframework.org/schema/util classpath:org/springframework/beans/factory/xml/spring-util-3.1.xsd">


Tôi đã thực hiện thay đổi này trong xml springframework.org/schema/rabbit classpath: org / springframework / amqp / Rabbit / config / spring-Rabbit-1.6.xsd nhưng nó thông báo Không đọc được tài liệu lược đồ 'classpath: org / springframework / amqp / Rabbit / config / spring-Rabbit-1.6.xsd '? bất cứ đề nghị
Lalit Mehra

1

Bạn cần thêm các vị trí lược đồ vào định nghĩa bean của mình và sau đó chúng có thể được tìm thấy trong classpath thay vì tìm nạp qua mạng. Do sự cố định dạng của bạn, tôi không chắc chắn 100% rằng bạn chưa làm điều này.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- empty: the beans we use are in the base class's context. -->
</beans>

1

Chúng tôi đã giải quyết vấn đề khi thực hiện việc này:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false); // This avoid to search schema online
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", "TransactionMessage_v1.0.xsd");

Xin lưu ý rằng ứng dụng của chúng tôi là một ứng dụng ngoại tuyến độc lập Java.


1

Nếu bạn đang sử dụng eclipse cho sự phát triển của mình, sẽ rất hữu ích nếu bạn cài đặt plugin STS cho Eclipse [từ marketPlace cho phiên bản cụ thể của eclipse.

Bây giờ Khi bạn cố gắng tạo tệp cấu hình mới trong một thư mục (thường là tài nguyên) bên trong dự án, các tùy chọn sẽ có "Thư mục mùa xuân" và bạn có thể chọn tùy chọn "Tệp định nghĩa Spring Bean" Spring> Tệp cấu hình Spring Bean.

Với tùy chọn này được chọn, khi bạn làm theo các bước, nó sẽ yêu cầu bạn chọn không gian tên và các phiên bản cụ thể:

Và do đó, khả năng có một bình không tồn tại Hoặc phiên bản cũ có thể được loại bỏ.

Cũng sẽ đăng hình ảnh, nhưng danh tiếng của tôi khá thấp .. :(


1

Vấn đề nằm ở các tệp JAR mà bạn sử dụng trong ứng dụng của mình.

Những gì tôi đã làm, đã hiệu quả, là vào bên trong JARs cho SPRING-CORE, SPRING-BEANS, SPRING-CONTEXT, SPRING-TX phù hợp với phiên bản tôi đang sử dụng. Trong thư mục META-INF, tôi đã nối tất cả các spring.handlers và spring.schemas có trong các JAR đó.

Tôi đã giết hai con chim bằng một viên đá, tôi đã giải quyết được vấn đề của lược đồ nên điều này cũng hoạt động chính xác ở chế độ ngoại tuyến.

PS Tôi đã thử plugin maven cho SHADE và máy biến áp nhưng điều đó không hoạt động.


Làm thế nào bạn giải quyết vấn đề này, bạn có thể vui lòng giúp tôi hiểu điều đó. Tôi đang cần.
Kamini

1

Tôi đã có vấn đề này. Đối với hậu thế, ngoại lệ của tôi là:

org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 117;
schema_reference.4: Failed to read schema document
'http://www.springframework.org/schema/beans/spring-beans-4.2.xsd'

Tôi đã giải quyết nó khi nhận ra phiên bản spring-beansđược chỉ định trong Maven của tôi pom.xml4.1.x, do đó có nghĩa là .xsdkhông thể tìm thấy phiên bản cụ thể trên classpath.

Điều này đã được che giấu trong một thời gian dài vì tôi thường trực tuyến, vì vậy tôi nghĩ rằng ngoại tuyến đã "phá vỡ" bản dựng. Nhưng nó thực sự không có gì để làm với nó. Cập nhật của tôi pom.xmlđể chỉ định phiên bản chính xác spring-beans, cụ thể là 4.2.x, đã sửa nó.


1

Tôi đã gặp sự cố tương tự khi đang sử dụng phiên bản Spring-context 4.0.6 và spring-security phiên bản 4.1.0.

Khi thay đổi phiên bản spring-security thành 4.0.4 (vì không có phiên bản spring-security 4.0.6) trong pom và bảo mật xml -> schemaLocation của tôi, nó sẽ được biên dịch mà không có internet.

Vì vậy, điều đó có nghĩa là bạn cũng có thể giải quyết vấn đề này bằng cách:

  • thay đổi spring-security thành phiên bản cũ hơn hoặc giống với spring-context.

  • thay đổi spring-context thành một phiên bản mới hơn hoặc giống với spring-security.

(bất kỳ cách nào Spring-context trở nên mới hơn hoặc cùng một phiên bản với spring-security)


0

Tôi muốn thêm một số khía cạnh bổ sung của cuộc thảo luận này. Trong hệ điều hành windows, tôi đã quan sát thấy rằng khi một tệp jar chứa lược đồ được lưu trữ trong một thư mục có đường dẫn chứa ký tự khoảng trắng, ví dụ như trong ví dụ sau

"c:\Program Files\myApp\spring-beans-4.0.2.RELEASE.jar"

thì việc chỉ định URL vị trí lược đồ theo cách sau là không đủ khi bạn đang phát triển một số ứng dụng độc lập cũng hoạt động ngoại tuyến

<beans
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans org/springframework/beans/factory/xml/spring-beans-2.0.xsd"
    />

Tôi đã biết rằng kết quả của độ phân giải URL vị trí lược đồ như vậy là một tệp có đường dẫn như sau

"c:\Program%20Files\myApp\spring-beans-4.0.2.RELEASE.jar"

Khi tôi bắt đầu ứng dụng của mình từ một số thư mục khác không chứa ký tự khoảng trắng trên đường dẫn của nó thì độ phân giải vị trí lược đồ hoạt động tốt. Có thể ai đó gặp phải vấn đề tương tự? Tuy nhiên, tôi phát hiện ra rằng giao thức classpath hoạt động tốt trong trường hợp của tôi

<beans
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-2.0.xsd"
    />

0

Tôi cũng đã gặp phải vấn đề tương tự này. Trong trường hợp của tôi, cách giải quyết của tôi khá khác. Đây là tệp xml bối cảnh mùa xuân của tôi:

...
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">
...

Tôi không chỉ định bất kỳ phiên bản xsd nào vì tôi muốn mùa xuân sử dụng phiên bản xsd mới nhất bên trong các phụ thuộc mùa xuân. Phiên bản mùa xuân mà ứng dụng của tôi đã sử dụng là spring-bean-4.3.1.RELEASE.jar: 4.3.1.RELEASE và khi tôi lắp ráp ứng dụng của mình vào jar, tất cả các phụ thuộc spring tồn tại trong classpath của tôi. Tuy nhiên, tôi đã nhận được lỗi sau khi khởi động ngữ cảnh ứng dụng mùa xuân của mình:

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

Sau một thời gian khắc phục sự cố khó khăn, tôi nhận thấy vấn đề là do index.list bên trong thư mục META-INF của tệp jar của tôi. Với tệp index.list , không thể định vị trình xử lý không gian tên mùa xuân để phân tích cú pháp xml ngữ cảnh ứng dụng mùa xuân một cách chính xác. Bạn có thể đọc thêm về số báo mùa xuân này SPR-5705

Bằng cách xóa lập chỉ mục khỏi plugin maven-jar-plugin của mình , tôi có thể giải quyết vấn đề. Hy vọng điều này sẽ tiết kiệm một số lần cho những người có cùng một vấn đề.


0

Chỉ cần đảm bảo rằng tệp Spring jar có liên quan nằm trong classpath thời gian chạy của bạn. Trong trường hợp của tôi, chúng tôi đã thiếu spring-tx-4.3.4.RELEASE.jar từ classpath thời gian chạy. Sau khi thêm lọ này, sự cố đã được giải quyết.


0

Nếu không có kết nối internet trong nền tảng của bạn và bạn sử dụng Eclipse, hãy làm theo các bước sau (nó giải quyết được vấn đề của tôi)

  1. Tìm các tệp xsd chính xác (Bạn có thể giải nén các tệp này từ lọ của chúng. Ví dụ: spring-bean-xyxsd trong spring-bean-xyzRELEASE.jar)
  2. Thêm các tệp xsd này vào Danh mục XML của Eclipse. (Tùy chọn-> XML-> Danh mục XML, Thêm tệp)
  3. Thêm vị trí tệp này vào tệp cấu hình. (Hãy cẩn thận, ghi phiên bản chính xác của tệp)

Thí dụ:

xsi: schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-xyxsd "


-1

Xóa các lọ bạn đã thêm gần đây trong web-inf -> lib. ví dụ jstl lọ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.