独立spring应用程序中的cxf webservice使用maven打包为jar-with-dependencies

时间:2012-06-09 20:53:32

标签: maven xsd cxf

当运行像“java -jar my-app-0.0.1-SNAPSHOT-jar-with-dependencies.jar”这样的打包应用时,我收到以下错误:

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 47 in
XML document from URL [jar:file:/.../cxf/javafirst/target/my-app-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/application-context.xml]
is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 47; 
columnNumber: 61; cvc-complex-type.3.2.2: Attribute 'sendServerVersion'
is not allowed to appear in element 'httpj:engine'.

这是由于在apache.org上发布了过时的http-jetty.xsd架构。这不是我的问题。我的问题是,在以下情况下不会发生这种情况:

maven jetty:run

maven exec:java

服务直接针对解压缩的二进制目录运行,并且显然找到更新且正确的http-jetty.xsd模式文件。

我基本上想做一件事:

将webservice放入一个包含依赖项的jar中。这也应该包括所有XML模式文件,因为显然,使Web服务依赖于外部资源并不是一个好主意。

使用maven的最佳方法是什么?

我可能天真的解决方案是将XML模式文件手动复制到资源目录中,并告诉CXF在jar文件中解析它们。因此,我有两个更具体的问题:

1。)是否可以让maven找到XML模式文件并将它们复制到适当的位置? 2.)什么是让CXF在jar文件中查找模式文件的推荐方法?

3。)是否有更好的,最佳实践解决方案?

关于maven程序集插件的maven配置是http://maven.apache.org/plugins/maven-assembly-plugin/usage.html的最后两个部分的直接组合。

1 个答案:

答案 0 :(得分:1)

Spring有一个非常好的机制来解析它所需的模式文件 - 它通常不会从Web下载它,而是使用jar文件中的本地可用文件来获取模式并验证xml,例如。考虑Spring中的上下文自定义命名空间模式,如果查看spring-context.jar文件中的META-INF / spring.schemas文件,您将看到以下几行:

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

基本上它是说从类路径org.springframework.context.config.spring-context-3.1.xsd文件中解析spring-context-3.1.xsd文件

这也适用于任何第三方库,在您的情况下是http-jetty.xsd。

我认为我建议的是在META-INF /文件夹的jar文件中创建一个spring.schemas文件,为模式的完整路径添加一个条目,并将其替换为http-jetty的类路径版本的.xsd。