web-dev-qa-db-ja.com

「dependencies.dependency.version」にはエラーがありませんが、バージョンは親で管理されています

複数のモジュールを含むMavenプロジェクトがあります。 Eclipse(Juno、m2e)では、正常にコンパイルされるようです。しかし、モジュールの1つでMavenをインストールすると、ビルドはすぐに失敗します。

親ポン:

  <groupId>com.sw.system4</groupId>
  <artifactId>system4-parent</artifactId>
  <version>${system4.version}</version>
  <packaging>pom</packaging>
  <name>System 4 Parent Project</name>
  <modules>
    <module>system4-data</module>
     ...others...
  </modules>
  <properties>
    <system4.version>0.0.1-SNAPSHOT</system4.version>
    <spring.version>3.2.3.RELEASE</spring.version>
    ... others...
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
        <scope>runtime</scope>
      </dependency>
    ... lots of others ...
    </dependencies>
  </dependencyManagement>

子ポンム:

  <parent>
    <groupId>com.sw.system4</groupId>
    <artifactId>system4-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>system4-data</artifactId>
  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <scope>runtime</scope>
    </dependency>
    ... lots of others...
  </dependencies>

ビルドすると、次の出力が得られます。

[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR]   The project com.sw.system4:system4-data:0.0.1-SNAPSHOT (C:\work\eclips
e_workspaces\systemiv\system4-parent\system4-data\pom.xml) has 8 errors

[ERROR]     'dependencies.dependency.version' for org.springframework:spring-cor
e:jar is missing. @ line 16, column 16

... others omitted for clarity ...

コンパイルを試みない理由がわかりません。ランタイムスコープを親と子から削除しようとしましたが、違いはありません。助けてください!

51
fancyplants

あなたが試すことができると思ういくつかのこと:

  1. バージョンのリテラル値をchild pomに入れます

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.2.3.RELEASE</version>
      <scope>runtime</scope>
    </dependency>
    
  2. 通常、C:\ Users\user.m2\repositoryにある.m2キャッシュをクリアします。私は、Mavenで作業しているときにこれをかなり頻繁に行うと言います。特にコミットする前に、CIが実行されることをより確信できるようにします。毎回フォルダーを破棄する必要はありません。プロジェクトパッケージと.cacheフォルダーだけで十分な場合もあります。

  3. Relativepomタグを親pom宣言に追加します

    <parent>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1</version>
     <relativePath>../parent/pom.xml</relativePath>
    </parent>
    

Pomsに合計8つのエラーがあるようです。親のpomとプロパティを追加する前に、いくつかの基本的なコンパイルを実行しようとします。

39
Brian Blain

私が抱えていたのと同じ問題で誰かがここに道を見つけた場合、私の問題は、子ポンムからコピーした依存関係の周りの<dependencyManagement>タグが欠落していることでした。

33
Sherms

右、たくさんの髪を引き裂いた後、私はコンパイルシステムを持っています。

.m2キャッシュのクリーニングは1つの助けになりました(Brianに感謝)

私が犯した間違いの1つは、各依存関係の2つのバージョンを親pomのdependencyManagementセクションに配置することでした-<scope>runtime</scope>があるものとないものコマンドラインで実行できるようになります。これは問題を複雑にしているだけなので、ランタイムのものは削除しました。

親のバージョンを明示的に設定することも機能しているようです(mavenがこのようなプロパティを使用するためのより広範なサポートを持たないのは残念です!)

  <parent>
    <groupId>com.sw.system4</groupId>
    <artifactId>system4-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>

その後、すべての依存関係の子モジュールで奇妙な「依存関係の収集に失敗しました」というエラーが発生しました。

最終的に、各モジュールを個別にコンパイルするのではなく、親POMからコンパイルすることで問題を解決しました。これは、別のモジュールの比較的単純な修正でエラーが発生したことを教えてくれました。

つまり、子モジュールAに関連するMavenエラーが発生した場合、実際には無関係な子モジュールZに問題がある可能性があるため、そこを見てください。 (およびキャッシュを削除します)

2
fancyplants

理論的には、Mavenはプロパティを使用して親バージョンを設定することを許可していません。

あなたの場合、mavenは親pomの0.0.1-SNAPSHOTバージョンが現在プロジェクトにあるものであると単純に判断できないため、ローカルリポジトリでそれを見つけようとします。スナップショットであるため、おそらく見つけますが、おそらく依存関係管理セクションが含まれていない古いバージョンです。

ただし、回避策があります:

これを使用して、子ポンムの親セクションを変更するだけです。

<parent>
    <groupId>com.sw.system4</groupId>
    <artifactId>system4-parent</artifactId>
    <version>${system4.version}</version>
    <relativePath>../pom.xml</relativePath>  <!-- this must match your parent pom location -->
</parent>
2
Yanflea

同じエラーが発生しました。<dependencyManagement>に子の依存関係を追加するのを忘れました。たとえば、親pomの場合:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.sw.system4</groupId>
            <artifactId>system4-data</artifactId><!-- child artifact id -->
            <version>${project.version}</version>
        <dependency>

        <!-- add all third party libraries ... -->

    </dependencies>
<dependencyManagement>
1
Terran

子のプロジェクト/親/バージョンノードの値が、その親のプロジェクト/バージョン値と一致していることを確認してください

0
inor

子モジュールを実行する前に親モジュールを構築する必要があります。

0
traeper

ちょうどうまくいったのは、.m2フォルダーのsettings.xmlを削除することでした。このファイルは、プロジェクトに存在しなかったspring mvcとwebのバージョンを探すように指示していました。

0
Camilo