0

spring-data-mongodb に依存するシンプルなスプリング コンソール アプリがあります。Eclipse (Run As -> Java Application) 経由でメイン メソッドを実行すると、アプリは正常に動作しますが、取得した単一の jar としてパッケージ化すると、

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/mongo]

単一の jar を作成するために、Maven アセンブリ プラグインを使用しました

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <manifest>
        <mainClass>au.com.myapp.MainClass</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

そしてmavenコマンド

mvn clean package assembly:single

spring-data-mongodb jar 内のすべての maven 依存関係クラスが spring-mongo.xsd を含めて問題なくコピーされていることを確認しました。また、単一のjarファイルと一緒にspring-data-mongodb.jarを使用-cp .して追加しようとしましたが、うまくいきません

この問題を解決するにはどうすればよいですか / デバッグするために他にできることはありますか

4

1 に答える 1

0

この問題は、アセンブリ プラグインを使用して「uber jar」を作成すると、各依存関係 jar の META-INF フォルダーの内容が重複するために発生しました。

たとえば、spring-data-mongodb には名前空間ハンドラーを宣言する META-INF/spring.handlers ファイルがあり、私の場合は別の spring jar によって上書きされました

この事実から、アセンブリ プラグインを使用して uber jar を作成することは、実際には良い方法ではないと結論付けました。したがって、元のアプリケーション jar を使用し、そのすべての依存関係を別のフォルダーに配置しました。

これは、以下のように maven-dependency-plugin を使用して maven で実現できます。すべての依存関係は、ターゲット/依存関係にコピーされます (デフォルトでは、プロセス リソース フェーズにバインドされます)。

  <!-- Copy all dependencies (including transitive) into target/dependency folder -->
  <plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

次に、コマンドラインで-cpパラメーターを使用してアプリを実行します (Windows)

java -cp "myapp.jar;dependency/*" com.mycompany.MainClass

ダウンサイトはもちろん、実行時の依存関係の不一致を避けるために、運用サーバーにデプロイするときに依存関係フォルダー全体を削除して再コピーする必要があります

于 2013-06-03T05:33:45.130 に答える