Spring schemaLocation schlägt fehl, wenn keine Internetverbindung besteht


107

Ich benutze Spring und application-context.xmlhabe folgende Definitionen:

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

..... .....

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

Irgendwelche Vorschläge, wie man das Problem behebt?

Antworten:


115

Es ist nicht erforderlich, das classpath: -Protokoll in Ihrer schemaLocation-URL zu verwenden, wenn der Namespace korrekt konfiguriert ist und sich die XSD-Datei in Ihrem Klassenpfad befindet.

Das Spring-Dokument " Registrieren des Handlers und des Schemas " zeigt, wie es gemacht werden sollte.

In Ihrem Fall bestand das Problem wahrscheinlich darin, dass das Spring-Context-Glas in Ihrem Klassenpfad nicht 2.1 war. Aus diesem Grund wurde das Problem behoben, indem das Protokoll in Klassenpfad geändert wurde und das spezifische 2.1 XSD in Ihren Klassenpfad eingefügt wurde.

Nach dem, was ich gesehen habe, sind 2 Schemata für die Haupt-XSD definiert, die in einem Federglas enthalten sind. Einmal, um die Schema-URL mit der Version aufzulösen, und einmal ohne.

Als Beispiel sehen Sie diesen Teil des Inhalts von spring.schemas 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

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

im Klassenpfad.

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

oder

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

wird gegen validiert

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

im Klassenpfad.

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

ist nicht definiert, daher sucht Spring anhand der in schemaLocation definierten Literal-URL danach.


37
Für diejenigen, die eine Zusammenfassung benötigen: Spring kann die Schemas im Klassenpfad nicht finden. Die Spring Core-JAR verfügt über eine Schema-> Dateinamenzuordnung, die in der JAR enthalten ist. Wenn dies nicht behoben werden kann, wird es ins Internet gestellt.
Alex

Ich habe es so deklariert "http:////www.springframework.org/schema/context http: ///www.springframework.org/schema/context/spring-context-4.0.xsd". Ich habe das 4.0-Glas in Glassfish / Domains / Domain1 / Lib. Wann immer ich das Projekt bereitstelle, bezieht sich Glassfish auf das Internet. Ist dieses Problem spezifisch für Glassfish-4.0? (Weitere '/' s zur Formatierung hinzugefügt)
Pragalathan M

Ich denke, der neue Link "Registrieren des Handlers und des Schemas" sollte hier sein: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

1
@ Kirk - dieser Link scheint unterbrochen zu sein
Stormcloud

2
@Stormcloud, ja, der ursprüngliche Link scheint zurück zu sein und der von mir vorgeschlagene ist defekt. Hier ist der neueste Dokumentlink: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

28

Ich habe es gelöst

<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.xsdist der Schlüssel für den Offline-Modus (keine Internetverbindung). Außerdem habe ich in der spring-context-2.1.xsdNähe (dasselbe Verzeichnis) der Datei application-context.xml kopiert


6
Für Intellij-Benutzer, die möglicherweise darauf stoßen. Dies funktioniert, obwohl Intellij die Klassenpfadsyntax in schemalLocation nicht erkennt und als Fehler hervorhebt.
Upgradingdave

Ein großes Dankeschön @DaveParoulek - der Fehler hat mich umgehauen, aber das macht absolut den Trick.
Zach Johnson

18

So etwas hat bei mir funktioniert.

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
Ja, das funktioniert, weil die xsd im Federglas verpackt ist. Sie müssen also nicht auf springframework.com nachsehen, wann Sie die xsd im Glas verwenden können :)
Somaiah Kumbera

Diese Lösung hat bei mir funktioniert, weil ich die Frühlingsabhängigkeiten in einem Glas hatte, das ich als externes Glas meine, und ohne Internetfehler funktioniert Ihre Lösung sehr gut für mich, vielen Dank, Gott sei Dank.
Chiperortiz

@godlikeNoob Ich habe es versucht, aber es wird erneut der Fehler "cvc-elt.1: Die Deklaration des Elements 'bean' kann nicht gefunden werden."
Kamini

6

Falls jemand über dieselbe Wurzel wie ich hier ankommt, bin ich auf dieses Problem gestoßen, weil ich eine einzelne JAR mit allen Abhängigkeiten erstellt habe, einschließlich Spring JARs. Infolgedessen wurde die Datei spring.schemas in einigen META-INF- Verzeichnissen von Spring JARs überschrieben.

Ich habe hier Lösungsvorschläge gefunden: Wie erstelle ich mit maven ein Spring-basiertes ausführbares Glas?


5

Bin heute auf ein ähnliches Problem gestoßen. In meinem Fall war das Schatten-Plugin der Schuldige, zusätzlich zu springframework.org, das einen Ausfall hatte. Das folgende Snippet hat die Dinge geklärt:

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


Wo muss das obige Snippet hinzugefügt werden?
Kamini

4

Sie sollten überprüfen, ob sich die Dateien spring.handlersund spring.schemasim Klassenpfad befinden und den richtigen Inhalt haben.

Dies kann mit gemacht werden ClassLoader.getResource(..). 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 im Klassenpfad befinden, wenn Spring initiiert werden kann.


1
Hallo, Ihre Lösung ist sehr komplex. Ich verstehe nicht, was du meinst. jroller.com/marshbourdon/entry/using_spring_2_x_xml , ich habe es versucht, aber es funktioniert nicht. Irgendwelche Vorschläge ? Es kann nicht komplex sein, eine Webanwendung zu bearbeiten, wenn keine Internetverbindung besteht. habe ich recht ? Vielen Dank.
Altug

1
Der Frühling sollte sofort funktionieren. Etwas mit Ihrem Klassenpfad ist falsch. Meine Antwort enthielt nur einige Hinweise zur Analyse Ihres Problems.
Thomas Jung

2

Klassenpfad suchen

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

Sie werden die Zeilen wie folgt sehen.

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

kopiere nach = und konfiguriere Beans wie folgt.

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


Ich habe diese Änderung im XML- Klassenpfad springframework.org/schema/rabbit vorgenommen : org / springframework / amqp / rabbit / config / spring-rabbit-1.6.xsd, aber es heißt, dass das Schemadokument 'classpath: org / springframework / amqp / nicht gelesen werden konnte rabbit / config / spring-rabbit-1.6.xsd '? jeder Vorschlag
Lalit Mehra

1

Sie müssen Ihrer Bean-Definition Schema-Speicherorte hinzufügen, die dann im Klassenpfad gefunden werden können, anstatt über das Netz abgerufen zu werden. Angesichts Ihrer Formatierungsprobleme bin ich mir nicht 100% sicher, dass Sie dies noch nicht tun.

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

Wir haben das Problem damit gelöst:

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.


1

Wenn Sie Eclipse für Ihre Entwicklung verwenden, ist es hilfreich, wenn Sie das STS-Plugin für Eclipse [vom marketPlace für die spezifische 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-Ordner" und Sie können die Option "Spring Bean-Definitionsdatei" Spring> Spring Bean-Konfigurationsdatei auswählen.

Wenn diese Option ausgewählt ist und Sie die Schritte ausführen, werden Sie aufgefordert, Namespaces und die spezifischen Versionen auszuwählen:

Und so kann die Möglichkeit eines nicht existierenden Glases oder einer alten Version ausgeschlossen werden.

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


1

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, SPRING-TX zu gelangen, die der von mir verwendeten Version entsprechen. Im META-INF-Ordner habe ich alle spring.handlers und spring.schemas verkettet, die in diesen JARs enthalten sind.

Ich habe zwei Fliegen mit einer Klappe geschlagen und das Problem der Schemata gelöst, sodass dies auch im Offline-Modus korrekt funktioniert.

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


Wie haben Sie dieses Problem gelöst? Können Sie mir bitte helfen, das zu verstehen? Ich bin in Not.
Kamini

1

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 habe es gelöst, als ich feststellte, dass die spring-beansin meinem Maven angegebene Version pom.xmlwar 4.1.x, was bedeutet, dass die spezifische Version .xsdnicht im Klassenpfad gefunden werden konnte.

Dies wurde für eine lange Zeit maskiert, weil ich normalerweise online bin, also dachte ich, offline zu sein hätte den Build "kaputt gemacht". Aber es hatte wirklich nichts damit zu tun. Das Aktualisieren von my pom.xml, um die richtige Version von anzugeben spring-beans, hat es nämlich 4.2.xbehoben.


1

Ich hatte das gleiche Problem, als ich Spring-Context Version 4.0.6 und Spring-Security Version 4.1.0 verwendete.

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

Das heißt, Sie können dies auch lösen, indem Sie:

  • Ändern der Federsicherheit auf eine ältere oder gleiche Version als der Federkontext.

  • Ändern des Federkontexts auf eine neuere oder gleiche Version als die Federsicherheit.

(Wie auch immer, Spring-Kontext ist neuer oder dieselbe Version von Spring-Security)


0

Ich möchte einen zusätzlichen Aspekt dieser Diskussion hinzufügen. Unter Windows habe ich festgestellt, dass eine JAR-Datei, die ein Schema enthält, in einem Verzeichnis gespeichert ist, dessen Pfad ein Leerzeichen enthält, beispielsweise wie im folgenden Beispiel

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

Wenn Sie eine eigenständige Anwendung entwickeln, die auch offline funktionieren soll, reicht es nicht aus, die URL des Schemastandorts wie folgt anzugeben

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

Ich habe erfahren, dass das Ergebnis einer solchen URL-Auflösung des Schema-Speicherorts eine Datei ist, die einen Pfad wie den folgenden hat

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

Als ich meine Anwendung von einem anderen Verzeichnis aus startete, das kein Leerzeichen auf dem Pfad enthielt, funktionierte die Auflösung des Schema-Speicherorts einwandfrei. Vielleicht hatte jemand ähnliche Probleme? Trotzdem habe ich festgestellt, dass das Klassenpfadprotokoll in meinem Fall gut funktioniert

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

0

Ich war auch auf dieses ähnliche Problem gestoßen. In meinem Fall ist meine Auflösung ganz anders. Hier ist meine XML-Datei für den Frühlingskontext:

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

Ich gebe keine xsd-Version an, da Spring die neueste xsd-Version innerhalb der Spring-Abhängigkeiten verwenden soll. Die von meiner Anwendung verwendete Spring- Version war spring-bean-4.3.1.RELEASE.jar: 4.3.1.RELEASE. Wenn ich meine Anwendung in jar zusammenstelle, sind alle Spring-Abhängigkeiten in meinem Klassenpfad vorhanden. Beim Start meines Spring-Anwendungskontexts wurde jedoch die folgende Fehlermeldung angezeigt:

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

Nach einiger schwieriger Fehlerbehebung stellte ich fest, dass das Problem auf die index.list im META-INF-Ordner meiner JAR-Datei zurückzuführen ist. Mit der Datei index.list können Spring-Namespace-Handler nicht gefunden werden, um den XML-Kontext der Spring-Anwendung korrekt zu analysieren. Weitere Informationen zu dieser Frühjahrsausgabe finden Sie hier SPR-5705

Durch Entfernen der Indizierung aus meinem Maven-Jar-Plugin kann ich das Problem beheben. Ich hoffe, dies spart einige Zeit für Menschen mit dem gleichen Problem.


0

Stellen Sie einfach sicher, dass sich die entsprechende Spring-JAR-Datei in Ihrem Laufzeitklassenpfad befindet. In meinem Fall fehlte spring-tx-4.3.4.RELEASE.jar im Laufzeitklassenpfad. Nach dem Hinzufügen dieses JARs wurde das Problem behoben.


0

Wenn auf Ihrer Plattform keine Internetverbindung besteht und Sie Eclipse verwenden, führen Sie die folgenden Schritte aus (dies löst mein Problem).

  1. Finden Sie die genauen xsd-Dateien (Sie können diese Dateien aus ihren Gläsern entpacken. Beispiel: spring-bean-xyxsd in spring-bean-xyzRELEASE.jar)
  2. Fügen Sie diese xsd-Dateien zum Eclipse XML-Katalog hinzu. (Einstellungen-> XML-> XML-Katalog, Dateien hinzufügen)
  3. Fügen Sie den Speicherort dieser Dateien zur Konfigurationsdatei hinzu. (Seien Sie vorsichtig, schreiben Sie die genaue Version der Datei)

Beispiel:

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


-1

Entfernen Sie kürzlich hinzugefügte Gläser in der web-inf -> lib. Zum Beispiel JSTL-Gläser.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.