Spring schemaLocation kończy się niepowodzeniem, gdy nie ma połączenia z Internetem


107

Używam Springa i application-context.xmlmam następujące definicje:

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

.....

W przypadku utraty połączenia internetowego nie mogę uruchomić aplikacji za pośrednictwem programu Tomcat ani Molo.

To daje:

[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........

Jakieś sugestie, jak to naprawić?

Odpowiedzi:


115

Nie ma potrzeby używania klasy classpath: protocol w adresie URL schemaLocation, jeśli przestrzeń nazw jest skonfigurowana poprawnie, a plik XSD znajduje się w ścieżce klas.

Dokument Spring " Rejestracja handlera i schematu " pokazuje, jak należy to zrobić.

W twoim przypadku problem polegał prawdopodobnie na tym, że słoik kontekstu wiosennego na twojej ścieżce klas nie był 2.1. Właśnie dlatego zmiana protokołu na ścieżkę klas: i umieszczenie specyficznego XSD 2.1 w ścieżce klas rozwiązało problem.

Z tego, co widziałem, istnieją 2 schematy zdefiniowane dla głównego XSD zawartego w słoiku ze sprężyną *. Raz, aby rozwiązać adres URL schematu z wersją i raz bez niej.

Jako przykład zobacz tę część treści spring.schemas w 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

Oznacza to, że (w xsi: schemaLocation)

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

będzie podlegać walidacji

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

w ścieżce klas.

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

lub

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

będzie podlegać walidacji

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

w ścieżce klas.

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

nie jest zdefiniowany, więc Spring będzie szukał go przy użyciu dosłownego adresu URL zdefiniowanego w schemaLocation.


37
Dla tych, którzy potrzebują podsumowania: Wiosna nie może znaleźć schematów w ścieżce klas. Spring core JAR ma odwzorowanie schematu-> nazwy pliku, które jest zawarte w pliku JAR. Jeśli nie będzie w stanie tego rozwiązać, przejdzie do sieci.
Alex

Zadeklarowałem to w ten sposób: „http:////www.springframework.org/schema/context http: ///www.springframework.org/schema/context/spring-context-4.0.xsd”. Mam jar 4.0 w folderze Glassfish / domains / domain1 / lib. Kiedy wdrażam projekt, glassfish odnosi się do Internetu. Czy ten problem jest specyficzny dla Glassfish-4.0? (dodano więcej „/” do formatowania)
Pragalathan M

Myślę, że nowy link „Rejestracja programu obsługi i schematu” powinien być tutaj: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

1
@Dirk - ten link wygląda na uszkodzony
Stormcloud

2
@Stormcloud, tak, oryginalny link wydaje się być z powrotem, a ten, który zasugerowałem, jest uszkodzony. Oto link do najnowszego dokumentu: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

28

Rozwiązałem to

<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.xsdjest kluczem do pracy w trybie offline (bez połączenia z Internetem). Skopiowałem również w spring-context-2.1.xsdpobliżu (tego samego katalogu) plik application-context.xml


6
Dla użytkowników intellij, którzy mogą się z tym spotkać. Działa to nawet wtedy, gdy intellij nie rozpoznaje składni ścieżki klas wewnątrz schemalLocation i zaznacza ją jako błąd.
Upgradingdave

Ogromne podziękowania @DaveParoulek - błąd mnie wyrzucał, ale to absolutnie załatwia sprawę.
Zach Johnson,

18

Coś takiego działało na mnie.

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
Tak, to działa, ponieważ xsd jest zapakowany w słoiczku. Nie musisz więc sprawdzać na springframework.com, kiedy możesz użyć xsd w słoiku :)
Somaiah Kumbera

To rozwiązanie zadziałało dla mnie, ponieważ miałem zależności sprężynowe w słoiku, to znaczy jako zewnętrzny słoik i bez awarii internetu twoje rozwiązanie działało bardzo dobrze dla mnie, wielkie dzięki Bogu.
chiperortiz

@godlikeNoob Próbowałem tego, ale ponownie daje to błąd "cvc-elt.1: Nie można znaleźć deklaracji elementu 'beans'."
Kamini

6

Na wypadek, gdyby ktoś dotarł tutaj przez ten sam root, co ja - napotkałem ten problem, ponieważ budowałem pojedynczy plik JAR ze wszystkimi zależnościami, w tym Spring JAR. W rezultacie plik spring.schemas w niektórych katalogach META-INF plików Spring JAR został nadpisany.

Sugerowane rozwiązania znalazłem tutaj: Jak stworzyć plik jar wykonywalny na bazie wiosny za pomocą maven?


5

Dzisiaj napotkałem podobny problem. W moim przypadku to wtyczka cieni była winowajcą, oprócz awarii springframework.org. Poniższy fragment wyjaśnił sprawę:

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

Ktoś HTH


gdzie należy dodać powyższy fragment kodu?
Kamini,

4

Powinieneś sprawdzić, spring.handlersczy spring.schemaspliki i znajdują się w ścieżce klas i mają odpowiednią zawartość.

Można to zrobić za pomocą ClassLoader.getResource(..). Metodę można uruchomić za pomocą zdalnego debugera w środowisku wykonawczym. Rozszerzalną konfigurację tworzenia XML opisano w dokumencie Spring Reference B.5. Rejestrowanie procedury obsługi i schematu .

Zwykle pliki powinny znajdować się w pliku spring jar (springframework.jar / META-INF /) i na ścieżce klas, kiedy można zainicjować Spring.


1
cześć, twoje rozwiązanie jest bardzo złożone; nie rozumiem, co masz na myśli? jroller.com/marshbourdon/entry/using_spring_2_x_xml , próbowałem tego, ale to nie działa. Jakieś sugestie ? Praca z aplikacją internetową bez połączenia z Internetem nie może być skomplikowana. czy mam rację ? Dzięki.
Altug

1
Wiosna powinna zadziałać po wyjęciu z pudełka. Coś ze ścieżką klasy jest nieprawidłowe. Moja odpowiedź zawierała tylko kilka wskazówek, jak przeanalizować twój problem.
Thomas Jung

2

Znajdź ścieżkę zajęć

Jeśli używasz eclipse, kliknij odpowiedni plik jar. Idź do -> META-INF-> otwórz plik spring.schemas

zobaczysz linie jak poniżej.

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

skopiuj po = i skonfiguruj ziarna, jak poniżej.

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


Dokonałem tej zmiany w xml springframework.org/schema/rabbit classpath: org / springframework / amqp / rabbit / config / spring-rabbit-1.6.xsd, ale jest napisane, że nie można odczytać dokumentu schematu 'classpath: org / springframework / amqp / rabbit / config / spring-rabbit-1.6.xsd '? wszelkie sugestie
Lalit Mehra

1

Musisz dodać lokalizacje schematu do swojej definicji fasoli, a następnie można je znaleźć w ścieżce klas zamiast pobierać przez sieć. Biorąc pod uwagę problemy z formatowaniem, nie jestem w 100% pewien, czy jeszcze tego nie robisz.

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

Rozwiązaliśmy problem w ten sposób:

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

Należy pamiętać, że nasza aplikacja jest samodzielną aplikacją offline w języku Java.


1

Jeśli używasz eclipse do rozwoju, pomocne będzie zainstalowanie wtyczki STS dla Eclipse [z marketPlace dla określonej wersji eclipse.

Teraz Kiedy próbujesz utworzyć nowy plik konfiguracyjny w folderze (zwykle zasobach) wewnątrz projektu, opcje miałyby „Folder wiosenny” i możesz wybrać opcję „Plik definicji Spring Bean” Wiosna> Plik konfiguracyjny Spring Bean.

Po zaznaczeniu tej opcji podczas wykonywania kroków prosi o wybranie przestrzeni nazw i określonych wersji:

W ten sposób można wyeliminować możliwość posiadania nieistniejącego słoika lub starej wersji.

Opublikowałbym również zdjęcia, ale moja reputacja jest dość niska .. :(


1

Problem leży w plikach JAR, których używasz w swojej aplikacji.

To, co zrobiłem, co zadziałało, to dostać się do słoików dla SPRING-CORE, SPRING-BEANS, SPRING-CONTEXT, SPRING-TX, które pasują do wersji, której używam. W folderze META-INF połączyłem wszystkie schematy spring.handlers i spring.schemes, które znajdują się w tych plikach JAR.

Upiłem dwie pieczenie na jednym ogniu, rozwiązałem problem schematów więc to też działa poprawnie w trybie offline.

PS Próbowałem wtyczki maven dla SHADE i transformatorów, ale to nie zadziałało.


Jak rozwiązałeś ten problem, czy możesz mi pomóc to zrozumieć. Jestem w potrzebie.
Kamini

1

Miałem ten problem. Dla potomności moim wyjątkiem był:

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'

Rozwiązałem to, gdy zdałem sobie sprawę, że wersja spring-beanspodana w moim Mavenie pom.xmlbyła 4.1.x, co oznacza, że .xsdnie można znaleźć tego konkretnego w ścieżce klas.

Przez długi czas było to zamaskowane, ponieważ normalnie jestem online, więc pomyślałem, że bycie offline „zepsuło” kompilację. Ale to naprawdę nie miało z tym nic wspólnego. Aktualizacja mojego, pom.xmlaby określić poprawną wersję spring-beans, a mianowicie 4.2.xnaprawiona.


1

Miałem ten sam problem, gdy używam wersji 4.0.6 z kontekstem wiosennym i wersji 4.1.0 zabezpieczeń wiosny.

Kiedy zmieniam wersję Spring-Security na 4.0.4 (ponieważ 4.0.6 Spring-Security nie jest dostępna) w moim pom i security xml -> schemaLocation, zostaje skompilowany bez internetu.

Oznacza to, że możesz również rozwiązać ten problem poprzez:

  • zmiana zabezpieczenia sprężynowego na starszą lub taką samą wersję niż kontekst sprężynowy.

  • zmiana kontekstu sprężyny na nowszą lub taką samą wersję niż zabezpieczenia sprężynowe.

(w każdym razie kontekst wiosenny ma być nowszy lub ta sama wersja co zabezpieczenia sprężyny)


0

Chciałbym dodać dodatkowy aspekt tej dyskusji. W systemie Windows zauważyłem, że gdy plik jar zawierający schemat jest przechowywany w katalogu, którego ścieżka zawiera znak spacji, na przykład jak w poniższym przykładzie

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

wtedy określenie adresu URL lokalizacji schematu w następujący sposób nie jest wystarczające, gdy tworzysz samodzielną aplikację, która powinna działać również offline

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

Dowiedziałem się, że wynikiem takiego rozwiązania adresu URL lokalizacji schematu jest plik, który ma ścieżkę podobną do poniższej

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

Kiedy uruchomiłem moją aplikację z innego katalogu, który nie zawierał znaku spacji na swojej ścieżce, rozpoznawanie lokalizacji schematu działało dobrze. Może ktoś napotkał podobne problemy? Niemniej jednak odkryłem, że protokół classpath działa dobrze w moim przypadku

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

0

Miałem też podobny problem. W moim przypadku moja rozdzielczość jest zupełnie inna. Oto mój plik xml kontekstu wiosny:

...
<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">
...

Nie określam żadnej wersji xsd, ponieważ chcę, aby Spring używał najnowszej wersji xsd w zależnościach spring. Wersja wiosenna, z której korzystałem, to spring-beans-4.3.1.RELEASE.jar: 4.3.1.RELEASE i kiedy składam moją aplikację w jar, wszystkie zależności sprężynowe istnieją w mojej ścieżce klas. Otrzymałem jednak następujący błąd podczas uruchamiania mojego kontekstu aplikacji wiosennej:

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

Po trudnym czasie rozwiązywania problemu odkryłem, że problem jest spowodowany przez plik index.list w folderze META-INF mojego pliku jar. W przypadku pliku index.list nie można zlokalizować programów obsługi przestrzeni nazw spring, aby poprawnie przeanalizować plik XML kontekstu aplikacji Spring. Więcej o tym wiosennym numerze SPR-5705 przeczytasz

Usuwając indeksowanie z mojej wtyczki maven-jar-plugin , udało mi się rozwiązać problem. Mam nadzieję, że zaoszczędzi to trochę czasu osobom mającym ten sam problem.


0

Po prostu upewnij się, że odpowiedni plik jar sprężyny znajduje się w ścieżce klas środowiska wykonawczego. W moim przypadku brakowało spring-tx-4.3.4.RELEASE.jar ze ścieżki klas środowiska wykonawczego. Po dodaniu tego słoika problem został rozwiązany.


0

Jeśli na Twojej platformie nie ma połączenia z Internetem, a używasz Eclipse, wykonaj następujące kroki (to rozwiązuje mój problem)

  1. Znajdź dokładne pliki xsd (możesz rozpakować te pliki z ich słoików. Na przykład spring-beans-xyxsd in spring-beans-xyzRELEASE.jar)
  2. Dodaj te pliki xsd do katalogu Eclipse XML. (Preferencje-> XML-> Katalog XML, Dodaj pliki)
  3. Dodaj lokalizację tych plików do pliku konfiguracyjnego. (Uważaj, napisz dokładną wersję pliku)

Przykład:

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


-1

Usuń pliki JAR, które ostatnio dodałeś w web-inf -> lib. na przykład jstl jars.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.