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 スキーマ ファイルが明らかに検出されます。

私は基本的に1つのことをしたい:

依存関係を含む 1 つの jar に Web サービスを入れます。これには、すべての XML スキーマ ファイルも含める必要があります。これは、明らかに、Web サービスを外部リソースに依存させるのは得策ではないためです。

Mavenを使用してそれを行う最良の方法は何ですか?

私の素朴な解決策は、XML スキーマ ファイルをリソース ディレクトリに手動でコピーし、CXF に jar ファイルで解決するように指示することです。したがって、さらに具体的な質問が 2 つあります。

1.) Maven に XML スキーマ ファイルを見つけて、適切な場所にコピーさせることは可能ですか? 2.) CXF に jar ファイル内のスキーマ ファイルを検索させるための推奨される方法は何ですか?

3.) その問題に対するより良いベストプラクティスの解決策はありますか?

Maven アセンブリ プラグインに関する私の Maven 構成は、http://maven.apache.org/plugins/maven-assembly-plugin/usage.htmlの最後の 2 つのセクションを直接組み合わせたものです。

4

1 に答える 1

1

Spring には、必要なスキーマ ファイルを解決するための非常に優れたメカニズムがあります。通常、Web からダウンロードするのではなく、jar ファイル内のローカルで利用可能なファイルを使用してスキーマを取得し、xml を検証します。spring-context.jar ファイルの META-INF/spring.schemas ファイルを見ると、Spring のコンテキスト カスタム名前空間スキーマを検討すると、次の行に沿ってエントリが表示されます。

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 のクラスパス バージョンに置き換えることをお勧めします。

于 2012-06-09T21:05:41.453 に答える