it-swarm.com.de

Bei 'dependencies.dependency.version' fehlt ein Fehler, aber die Version wird im übergeordneten Element verwaltet

Ich habe ein Maven-Projekt, das mehrere Module enthält. In Eclipse (Juno, mit m2e) scheint es gut zu kompilieren. Aber wenn ich einen Maven auf einem der Module installiere, schlägt der Build sofort fehl.

Eltern-Pom:

  <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>

Kind pom:

  <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>

Beim Erstellen erhalte ich die folgende Ausgabe:

[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 ...

Ich verstehe nicht, warum es nicht einmal versucht zu kompilieren. Ich habe versucht, den Laufzeitbereich von Eltern und Kind zu entfernen, und es macht keinen Unterschied. Bitte helfen Sie!

51
fancyplants

Ein paar Dinge, von denen ich denke, dass Sie versuchen könnten:

  1. Setzen Sie den Literalwert der Version in das child pom

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.2.3.RELEASE</version>
      <scope>runtime</scope>
    </dependency>
    
  2. Leeren Sie Ihren .m2-Cache, der sich normalerweise in C:\Users\user.m2\repository befindet. Ich würde sagen, ich mache das ziemlich oft, wenn ich in Maven arbeite. Vor allem vor dem Festschreiben, damit ich sicherer sein kann, dass CI ausgeführt wird. Sie müssen den Ordner nicht jedes Mal neu laden, manchmal reichen nur Ihre Projektpakete und der .cache-Ordner aus.

  3. Fügen Sie Ihrer übergeordneten pom-Deklaration ein relativePath-Tag hinzu

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

Es sieht so aus, als hättest du insgesamt 8 Fehler in deinen Poms. Ich würde versuchen, eine grundlegende Kompilierung zum Laufen zu bringen, bevor ich das übergeordnete pom und die Eigenschaften hinzufüge.

39
Brian Blain

Wenn sich hier jemand mit dem gleichen Problem zurechtfindet, das ich hatte, bestand mein Problem darin, dass mir das <dependencyManagement> Tags um Abhängigkeiten, die ich aus dem untergeordneten POM kopiert hatte.

33
Sherms

Richtig, nach viel Haarausfall habe ich ein Kompilierungssystem.

Das Aufräumen des .m2-Cache hat geholfen (danke an Brian)

Einer der Fehler, den ich gemacht hatte, war, 2 Versionen jeder Abhängigkeit in den übergeordneten Abschnitt pom dependencyManagement zu schreiben - eine mit <scope>runtime</scope> und eins ohne - dies sollte versuchen, Eclipse glücklich zu machen (dh keine Fehler beim Kompilieren von Schurken anzuzeigen) und in der Lage sein, auf der Befehlszeile ausgeführt zu werden. Das machte die Sache nur komplizierter, deshalb habe ich die Laufzeit-Sachen entfernt.

Das explizite Einstellen der Version des übergeordneten Elements schien ebenfalls zu funktionieren (es ist eine Schande, dass Maven keine umfassendere Unterstützung für die Verwendung solcher Eigenschaften bietet!)

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

In der Folge wurde es seltsam, dass im Kindermodul für alle Abhängigkeiten keine Abhängigkeiten für Fehler erfasst wurden, da das Kindermodul nicht gefunden werden konnte - obwohl es genauso eingerichtet war wie andere Module, die kompiliert haben.

Ich habe es endlich gelöst, indem ich aus dem übergeordneten POM kompiliert habe, anstatt zu versuchen, jedes Modul einzeln zu kompilieren. Dies erzählte mir von einem Fehler mit einem relativ einfachen Fix in einem anderen Modul, der seltsamerweise dazu führte, dass alles kompiliert wurde.

Mit anderen Worten, wenn Sie Maven-Fehler in Bezug auf das Kindermodul A erhalten, kann es tatsächlich ein Problem mit dem nicht verwandten Kindermodul Z geben. Schauen Sie also dort nach. (und lösche deinen Cache)

2
fancyplants

Theoretisch erlaubt es maven nicht, eine Eigenschaft zu verwenden, um eine übergeordnete Version festzulegen.

In Ihrem Fall kann maven einfach nicht herausfinden, dass die 0.0.1-SNAPSHOT-Version Ihres übergeordneten POM die aktuell in Ihrem Projekt vorhandene ist, und versucht, sie in Ihrem lokalen Repository zu finden. Es wird wahrscheinlich eine gefunden, da es sich um eine Momentaufnahme handelt, aber es ist eine alte Version, die wahrscheinlich keinen Abschnitt für das Abhängigkeitsmanagement enthält.

Es gibt jedoch eine Problemumgehung:

Ändern Sie einfach den übergeordneten Bereich im untergeordneten Bereich wie folgt:

<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

Ich hatte den gleichen Fehler, ich habe vergessen, die untergeordneten Abhängigkeiten im <dependencyManagement>. Zum Beispiel im übergeordneten 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

Stellen Sie sicher, dass der Wert im Projekt-/Eltern-/Versionsknoten des Kindes mit dem Projekt-/Versionswert des Elternteils übereinstimmt

0
inor

Sie müssen das übergeordnete Modul erstellen, bevor Sie das untergeordnete Modul ausführen können.

0
traeper

Was gerade funktionierte, war das Löschen der settings.xml im .m2-Ordner: Diese Datei forderte das Projekt auf, nach einer Version von spring mvc und web zu suchen, die es nicht gab.

0
Camilo