Maven + Spring Project无法加载依赖的xsd文件

时间:2013-12-06 15:44:37

标签: java xml spring maven xsd

我几天来一直在努力解决这个问题。我试图用通常的spring命名空间初始化一个标准的Spring项目:bean,aop,context,util ...我当前的,非常初始的,beans.xml文件如下:

<?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"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:util="http://www.springframework.org/schema/util"
  xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xml
     http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context.xml
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/beans/spring-aop.xml
     http://www.springframework.org/schema/util http://www.springframework.org/schema/beans/spring-util.xml"
</beans>

当我尝试在Glassfish中编译和运行项目时,我在调用org.glassfish.weld.WeldDeployer时遇到了IllegalStateException。接下来,它指出依赖文档的XML必须格式良好,并显示一个依赖文件的第一行(例如spring-beans.xml),这显然是HTML。在进一步挖掘之后,我发现确实在我的mavencachedirs中缓存了这些.xsd文件,每个文件都有相同的HTML内容引用404 Not Found。我正在使用内部maven存储库脱机工作,但这不应该是一个问题,因为我的依赖Spring jar文件都有适当的 spring.schemas spring.handlers 文件。看起来我的项目似乎无法识别它们。

我对Spring有点新鲜,但我觉得我已经在研究这个问题时做了尽职调查。任何可能指出我正确方向的建议都将不胜感激。


UPDATE - 根据Spring schemaLocation fails when there is no internet connection中发布的一些提示,我将spring.handlers和spring.schemas文件合并到src / main / resources / META-INF中的两个文件中。运行getResource将返回此目录中每个文件的合并版本。也就是说,这仍然没有解决问题。


更新2 - 我在家里转载了这个问题。我使用以下原型在Netbeans 7.3.1上创建了一个新的Spring项目:

组ID:co.ntier
版本:1.0.2
工件ID:spring-mvc-archetype
存储库:http://repo.maven.apache.org/maven2/

创建项目后,我将一个beans.xml文件添加到类路径中并将其剥离为最基本的形式:

<?xml version="1.0" encoding="windows-1252"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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"
/>

我构建了项目并通过NetBeans部署到Glassfish 4.0,同时仍然连接到互联网。这按预期工作,没有错误。但是,当我从互联网上断开计算机并再次部署(并清除了... Netbeans \ Cache \ 7.3.1 \ mavencachedirs中缓存的xsd文件)时,我多次出现以下错误:

警告:WELD-001210在验证文件时发出警告:/ C:/Users/Elliott/Desktop/Development/SpringTest/target/SpringTest/WEB-INF/beans.xml@5针对xsd。 schema_reference.4:无法读取架构文档“http://www.springframework.org/schema/beans/spring-beans.xsd”,因为1)找不到该文档; 2)文件无法阅读; 3)文档的根元素不是。

我知道Spring 应该 spring.schemas spring.handlers 文件中读取以查找这些资源,但它显然不是!我挑战任何人试图重现这个问题,并证明这实际上是应该的。现在我不相信。

1 个答案:

答案 0 :(得分:0)

<强> PROGRESS !!

行。我90%肯定我已经找到了问题所在。当我创建beans.xml文件时,Netbeans会创建一个nb-configuration.xml文件,其中包含以下内容:

<spring-data xmlns="http://www.netbeans.org/ns/spring-data/1">
    <config-files>
        <config-file>beans.xml</config-file>
    </config-files>
    <config-file-groups/>
</spring-data>

如果我在web.xml文件中创建一个servlet:

<servlet>
    <servlet-name>SpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

并将beans.xml文件重命名为SpringDispatcher-servlet.xml,项目正确编译并加载xsd文件,无论是在线还是离线。

由于这在使用SpringDispatcher-servlet.xml时有效,但在Netbeans配置的beans.xml中没有用,我认为可以安全地假设当Netbeans配置为通过nb-configuration加载spring配置文件时,它无法引用类路径中所需的spring.schemas和spring.handlers文件。

对于Spring(我)来说,也许我完全错了,只是超级noob-y,但似乎这种行为似乎不正确。无论如何,至少我现在有办法向前迈进。