Spring schemaLocation schlägt fehl, wenn keine Internetverbindung besteht

Ich benutze Spring und in application-context.xml ich die folgenden Definitionen:

   

…..

Wenn meine Internetverbindung unterbrochen wird, kann ich meine Anwendung nicht über Tomcat oder Jetty ausführen.

Es gibt:

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

Irgendwelche Vorschläge, wie man es repariert?

   

Sie müssen das classpath: -Protokoll nicht in Ihrer schemaLocation-URL verwenden, wenn der Namespace korrekt konfiguriert ist und sich die XSD-Datei in Ihrem classnpfad befindet.

Das Spring doc ” Registrieren des Handlers und des Schemas ” zeigt, wie es gemacht werden sollte.

In Ihrem Fall war das Problem wahrscheinlich, dass das Spring-Context-Jar auf Ihrem classnpfad nicht 2.1 war. Deshalb wurde das Problem durch das Ändern des Protokolls in Classpath: und das Einfügen der spezifischen 2.1 XSD in den classnpfad behoben.

Von dem, was ich gesehen habe, gibt es 2 Schemas, die für die Haupt-XSD definiert sind, die in einem Spring-Jar enthalten sind. Einmal um die Schema-URL mit der Version aufzulösen und einmal ohne sie.

Als Beispiel sehen Sie diesen Teil der spring.schemas Inhalte in 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 

Dies bedeutet, dass (in xsi: schemaLocation)

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

wird gegen validiert werden

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

im classnpfad.

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

oder

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

wird gegen validiert werden

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

im classnpfad.

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

ist nicht definiert, daher sucht Spring mit der literalen URL, die in schemaLocation definiert ist.

Ich habe es getriggers

  

classpath:spring-context-2.1.xsd ist der Schlüssel für den Offline-Modus (keine Internetverbindung). Auch ich habe spring-context-2.1.xsd Nähe (gleiches Verzeichnis) der Datei application-context.xml kopiert

So etwas funktionierte für mich.

 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" 

Für den Fall, dass jemand über die gleiche Wurzel wie ich hier ankam, stieß ich auf dieses Problem, weil ich ein einzelnes JAR mit allen Abhängigkeiten einschließlich Spring JARs baute. Als Ergebnis wurde die Datei spring.schemas in einigen der META-INF- Verzeichnisse von Spring JARs überschrieben.

Ich habe hier Lösungsvorschläge gefunden: Wie erstelle ich federbasierte ausführbare Jar mit Maven?

Bin heute in ein ähnliches Problem geraten. In meinem Fall war es das Schatten-Plugin, das zusätzlich zu springframework.org einen Ausfall hatte. Der folgende Ausschnitt klärte die Dinge auf:

  META-INF/spring.schemas   META-INF/spring.handlers  

HTH jemand

Sie sollten überprüfen, spring.schemas Dateien spring.handlers und spring.schemas im classnpfad befinden und den richtigen Inhalt haben.

Dies kann mit ClassLoader.getResource(..) geschehen. Sie können die Methode mit einem Remote-Debugger in der Laufzeitumgebung ausführen. Das erweiterbare XML-Authoring-Setup wird in der Spring-Referenz B.5 beschrieben. Registrieren des Handlers und des Schemas

Normalerweise sollten sich die Dateien im Spring-Jar (springframework.jar / META-INF /) und auf dem classnpfad befinden, wenn Spring gestartet werden kann.

Sie müssen Ihrer Bean-Definition Schema-Speicherorte hinzufügen, und sie können dann im classnpfad gefunden und nicht über das Netz abgerufen werden. Angesichts Ihrer Formatierungsprobleme bin ich nicht 100% sicher, dass Sie dies nicht bereits tun.

 < ?xml version="1.0" encoding="UTF-8"?>    

Wir haben das Problem dadurch getriggers:

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

Bitte beachten Sie, dass unsere Anwendung eine eigenständige Java-Offline-App ist.

Wenn Sie Eclipse für Ihre Entwicklung verwenden, hilft es, wenn Sie das STS-Plugin für Eclipse [vom MarketPlace für die bestimmte Version von Eclipse installieren.

Wenn Sie jetzt versuchen, eine neue Konfigurationsdatei in einem Ordner (normalerweise Ressourcen) innerhalb des Projekts zu erstellen, haben die Optionen einen “Spring Folder” und Sie können eine “Spring Bean Definition File” Option Spring> Spring Bean Konfigurationsdatei wählen.

Wenn diese Option aktiviert ist, werden Sie bei der Ausführung von Schritten aufgefordert, die Namespaces und die spezifischen Versionen auszuwählen:

Und so kann die Möglichkeit, ein nicht existierendes Glas oder eine alte Version zu haben, eliminiert werden.

Hätte auch Bilder gepostet, aber mein Ruf ist ziemlich niedrig .. 🙁

Das Problem liegt in den JAR-Dateien, die Sie in Ihrer Anwendung verwenden.

Was ich getan habe, was funktioniert hat, war, in die JARs für SPRING-CORE, SPRING-BEANS, SPRING-CONTEXT und SPRING-TX zu kommen, die der Version entsprechen, die ich benutze. Innerhalb des Ordners META-INF verknüpfte ich alle Springhandler und Spring-Schemas, die in diesen JARs enthalten sind.

Ich habe zwei Fliegen mit einer Klappe geschlagen, ich habe das Problem der Schemas getriggers, also funktioniert das auch im Offline-Modus.

PS Ich habe das Maven-Plugin für SHADE und die Transformatoren ausprobiert, aber das hat nicht funktioniert.

Ich hatte dieses Problem. Für die Nachwelt war meine Ausnahme:

 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' 

Ich triggerse es, als ich erkannte, dass die Version von spring-beans die in meinem Maven pom.xml wurde, 4.1.x , was bedeutete, dass das spezifische .xsd nicht im classnpfad gefunden werden konnte.

Dies wurde lange Zeit maskiert, weil ich normalerweise online bin, also dachte ich, offline zu sein, habe den Build “kaputt gemacht”. Aber es hatte wirklich nichts damit zu tun. Aktualisieren meiner pom.xml , um die richtige Version von spring-beans , nämlich 4.2.x , zu spezifizieren, 4.2.x es.

Finde den classnpfad

Wenn Sie Eclipse verwenden, klicken Sie auf die entsprechende JAR-Datei. Gehe zu -> META-INF-> Datei öffnen spring.schemas

Sie werden die Linien so sehen wie unten.

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

kopiere nach = und konfiguriere Bohnen wie unten.

Ich möchte einige zusätzliche Aspekte dieser Diskussion hinzufügen. In Windows OS habe ich beobachtet, dass wenn eine JAR-Datei, die ein Schema enthält, in einem Verzeichnis gespeichert wird, dessen Pfad ein Leerzeichen enthält, zum Beispiel wie im folgenden Beispiel

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

Wenn Sie eine eigenständige Standalone-Anwendung entwickeln, die auch offline arbeiten soll, ist die Angabe der URL für den Schema-Standort auf die folgende Weise nicht ausreichend

  

Ich habe gelernt, dass das Ergebnis einer solchen Schema-URL-Auflösung eine Datei ist, die einen Pfad wie folgt hat

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

Als ich meine Anwendung von einem anderen Verzeichnis gestartet habe, das auf ihrem Pfad kein Leerzeichen enthielt, funktionierte die Schemapositionsauflösung einwandfrei. Vielleicht hatte jemand ähnliche Probleme? Trotzdem habe ich festgestellt, dass das Classpath-Protokoll in meinem Fall gut funktioniert

  

Ich war auch auf dieses ähnliche Problem gestoßen. In meinem Fall ist meine Entschließung ganz anders. Hier ist meine Spring Context XML-Datei:

 ...  ... 

Ich gebe keine xsd-Version an, da ich Frühling möchte, um die späteste xsd-Version innerhalb der Frühlingsabhängigkeiten zu verwenden. Die Spring-Version, die meine Anwendung verwendet, war spring-bohnen-4.3.1.RELEASE.jar: 4.3.1.RELEASE und wenn ich meine Anwendung in jar zusammenfüge, existieren alle Federabhängigkeiten in meinem classnpfad. Ich habe jedoch folgenden Fehler während des Starts meines Anwendungskontextes erhalten:

 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 . 

Nach einiger schwerer Fehlersuche fand ich das Problem aufgrund der index.list im META-INF-Ordner meiner JAR-Datei. Mit der Datei index.list können Spring-Namespace-Handler nicht gefunden werden, um den Spring-Anwendungskontext xml korrekt zu analysieren. Sie können mehr über diese Frühlingsausgabe SPR-5705 lesen

Indem ich die Indizierung von meinem maven-jar-plugin lösche , kann ich das Problem lösen. Hoffe, dass dies einige Male für Leute mit dem gleichen Problem sparen wird.

Stellen Sie nur sicher, dass sich die relevante Spring-Jar-Datei in Ihrem Laufzeitklassenpfad befindet. In meinem Fall fehlte uns spring-tx-4.3.4.RELEASE.jar vom classnpfad. Nach dem Hinzufügen dieses Jars wurde das Problem behoben.

Wenn auf Ihrer Plattform keine Internetverbindung besteht und Sie Eclipse verwenden, führen Sie die folgenden Schritte durch (es triggers mein Problem)

  1. Finden Sie die genauen xsd-Dateien (Sie können diese Dateien aus ihren jars entpacken. Zum Beispiel, spring-beans-xyxsd in spring-beans-xyzRELEASE.jar)
  2. Fügen Sie diese xsd-Dateien dem Eclipse-XML-Katalog hinzu. (Einstellungen-> XML-> XML-Katalog, Dateien hinzufügen)
  3. Fügen Sie diesen Dateispeicherort der Konfigurationsdatei hinzu. (Sei vorsichtig, schreibe die genaue Version der Datei)

Beispiel:

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

Ich hatte das gleiche Problem, wenn ich spring-context Version 4.0.6 und spring-security Version 4.1.0 verwende.

Wenn ich die Spring-Security-Version auf 4.0.4 ändere (weil 4.0.6 von Spring-Security nicht verfügbar ist), wird es in meiner Pom- und Sicherheits-XML -> SchemaLocation ohne Internet kompiliert.

Das bedeutet also, dass du das auch lösen kannst durch:

  • Ändern der Federsicherheit in eine ältere oder dieselbe Version als im Federkontext.

  • Ändern von Federkontext in eine neuere oder dieselbe Version als Federsicherheit.

(Irgendwie Spring-Kontext, um neuere oder gleiche Version zu Feder-Sicherheit zu sein)

Entfernen Sie die zuletzt im Web-inf -> lib hinzugefügten Gläser. zum Beispiel jstl Gläser.