4

Java プロジェクト X がプロジェクト Y に (pom ファイルで) 依存しています。

Yで変更し、MavenツールでX、Yをビルドしてから、問題なくXを(JBossで)実行しました。

Y に新しいクラスを追加し、(問題なく) Maven でビルドしてから X を実行するjava.lang.NoClassDefFoundErrorと、新しいクラスがスローされます。

Mavenの依存関係のバージョニングかそのようなものだと思います...主にGoogleで検索しましたが、何も効果がありません...この問題を解決するには??

4

6 に答える 6

7

モロ、あなたはコメントで、X には次の依存関係が宣言されていると書いています。

<dependency>
  <groupId>Y</groupId>
  <artifactId>Y</artifactId>
  <scope>provided</scope>
  <version>1.0</version>
</dependency>

最初のポイント。ここでは「固定」バージョンを使用しています (「SNAPSHOT」ではなく)。を使用すると、ビルドするたびSNAPSHOTに maven が自動的に最新のものを取得します。一方、1.0 を使用している場合、maven がこのアーティファクトをダウンロードすると、新しい 1.0 を取得しようとすることはありません。したがって、Y のバージョンをインクリメントするか、Y が活発に開発中 (拡張、バグ修正など) の場合は、実際に を使用する必要があります。の詳細については、 9.3.1.2の章を参照してください。スナップショット Sonatype の本のバージョン:SNAPSHOT SNAPSHOTSNAPSHOT

なぜこれを使うのですか?SNAPSHOT バージョンは、現在開発中のプロジェクトに使用されます。プロジェクトがアクティブな開発中のソフトウェア コンポーネントに依存している場合、SNAPSHOT リリースに依存することができ、Maven はビルドの実行時に定期的にリポジトリから最新のスナップショットをダウンロードしようとします。同様に、システムの次のリリースのバージョンが「1.4」である場合、正式にリリースされるまで、プロジェクトのバージョンは「1.4-SNAPSHOT」になります。

2点目。providedスコープを使用しています。章によると 9.4.1. 依存範囲:

provided依存関係は、JDK またはコンテナーがそれらを提供すると予想される場合に使用されます。たとえば、Web アプリケーションを開発している場合、サーブレットをコンパイルするには、コンパイル クラスパスでサーブレット API を使用できる必要がありますが、パッケージ化された WAR にサーブレット API を含めたくはありません。サーブレット API JAR は、アプリケーション サーバーまたはサーブレット コンテナーによって提供されます。provided 依存関係は、コンパイル クラスパス (実行時ではない) で利用できます。それらは推移的ではなく、パッケージ化されていません。

これは本当にあなたが望むものですか?X と Y を JBoss にどのようにデプロイしていますか? デフォルトのcompileスコープを使用するべきではありませんか?

于 2009-10-08T17:32:59.567 に答える
0

わかりました、情報が遅くなり申し訳ありません。

X パッケージは ejb であるため、X.jar には lib ディレクトリがありません。

次に、Y.jar を Jboss/server/default/lib に配置する必要があります。これは正しく機能しました。

すべてに感謝します。

于 2009-10-08T20:53:33.687 に答える
0

mvn install新しいクラスを追加した後、Y で実行しましたか?

于 2009-10-08T16:55:51.543 に答える
0

Y の新しいバージョンをインストール/デプロイし、X の依存関係を新しい Y バージョン用にアップグレードし、X を再ビルドしましたか?

于 2009-10-08T16:56:15.520 に答える
0

ビルドする前に、プロジェクト Y でmvn cleanを試しましたか?

于 2009-10-08T17:01:30.567 に答える
0

Maven は、ローカルおよびリモートのリポジトリから依存関係を解決しますが、 m2eclipseなどの IDE プラグインも、ワークスペース内のプロジェクトである依存関係を解決します。そのようなプラグインがない場合は、アーティファクト Y をローカル リポジトリにインストールするか、リモート リポジトリにデプロイして、プロジェクトのビルド時に変更が加えられたことを Maven が認識する前に、自分とピアがアクセスできるようにする必要があります。バツ。

ワークスペースの解像度のスクリーンショット http://docs.codehaus.org/download/attachments/11403480/project-properties.png

2 つのプロジェクトが密接に関連している場合は、プロジェクト X と Y が同時にビルドされるように、マルチモジュール ビルドを作成することを検討できます。

于 2009-10-08T17:02:10.017 に答える