Spring schemaLocation fails when there is no internet connection
There is no need to use the classpath: protocol in your schemaLocation URL if the namespace is configured correctly and the XSD file is on your classpath.
Spring doc "Registering the handler and the schema" shows how it should be done.
In your case, the problem was probably that the spring-context jar on your classpath was not 2.1. That was why changing the protocol to classpath: and putting the specific 2.1 XSD in your classpath fixed the problem.
From what I've seen, there are 2 schemas defined for the main XSD contained in a spring-* jar. Once to resolve the schema URL with the version and once without it.
As an example see this part of the spring.schemas contents 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.xsdhttp\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsdhttp\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.0.xsd
This means that (in xsi:schemaLocation)
http://www.springframework.org/schema/context/spring-context-2.5.xsd
will be validated against
org/springframework/context/config/spring-context-2.5.xsd
in the classpath.
http://www.springframework.org/schema/context/spring-context-3.0.xsd
or
http://www.springframework.org/schema/context/spring-context.xsd
will be validated against
org/springframework/context/config/spring-context-3.0.xsd
in the classpath.
http://www.springframework.org/schema/context/spring-context-2.1.xsd
is not defined so Spring will look for it using the literal URL defined in schemaLocation.
I solved it
<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.xsd
is the key for working offline mode (no internet connection). Also i copied spring-context-2.1.xsd
near (same directory) the application-context.xml file
Something like this worked for me.
xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context classpath:org/springframework/beans/factory/xml/spring-context-3.0.xsd"