1

运行“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 模式文件。

我基本上想做一件事:

将 web 服务放入一个包含依赖项的 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最后两个部分的直接组合。

4

1 回答 1

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

基本上它的意思是从类路径文件中解析 spring-context-3.1.xsdorg.springframework.context.config.spring-context-3.1.xsd文件

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

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

于 2012-06-09T21:05:41.453 回答