Wie füge ich ein Projekt als Abhängigkeit von einem anderen Projekt hinzu?

76

Es gibt zwei unabhängige Projekte ( myWarProjectund MyEjbProject). Wenn ich das in erstelle, muss myWarProjectich das MyEjbProjectIn im lokalen Repository installieren , damit ich es im myWarProject als Abhängigkeit definieren und das myWarProject erfolgreich verpacken kann.

Gibt es eine Möglichkeit, dies zu handhaben, ohne das MyEjbProjectseparat zu installieren und auch ohne als übergeordnete Module zu definieren.

Ich weiß, dass dies durch Ameisenbau erreicht werden kann, frage mich aber, ob es einen Weg gibt, mit Maven umzugehen?

Wir können das übergeordnete Projekt mit "pom" erstellen und die beiden anderen unter das übergeordnete Projekt verschieben. Leider kann ich dies nicht tun, da wir diese beiden Projekte derzeit bereits als separate Projekte im CVS haben, deren Struktur ich nicht ändern kann. Wenn ich das durch eine POM-Datei bewältigen kann, ist dies das, wonach ich suche.

kds
quelle
Hallo Simon, Danke für die schnelle Antwort. Tatsächlich ist MyEjbProject ein weiteres Maven-Projekt, das ich beim Erstellen des myWarProject erstellen muss. Gibt es eine Möglichkeit, das MyEjbProject-POM im myWarProject zu definieren?
kds
Bitte sagen Sie mir: Inwiefern hängen sie voneinander ab? Im Moment sieht es so aus, als ob das Kriegsprojekt vom EJB abhängt, um eine vollständige Webanwendung zu erstellen. In diesem Fall wären die beiden Projekte doch nicht so unabhängig.
Simon Hellinger
Ich habe meine Antwort bearbeitet (am Ende etwas hinzugefügt). Hoffentlich kommt dies Ihrer Frage näher.
Simon Hellinger
Eine zweite Änderung meiner Antwort, vielleicht haben wir diesmal Glück gehabt :)
Simon Hellinger

Antworten:

69

Angenommen, das MyEjbProject ist kein anderes Maven-Projekt, das Sie besitzen oder mit maven erstellen möchten, können Sie Systemabhängigkeiten verwenden, um auf diese Weise eine Verknüpfung mit der vorhandenen JAR-Datei des Projekts herzustellen

<project>
   ...
   <dependencies>
      <dependency>
         <groupId>yourgroup</groupId>
         <artifactId>myejbproject</artifactId>
         <version>2.0</version>
         <scope>system</scope>
         <systemPath>path/to/myejbproject.jar</systemPath>
      </dependency>
   </dependencies>
   ...
</project>

Das heißt, es ist normalerweise die bessere (und bevorzugte) Möglichkeit, das Paket im Repository zu installieren, indem Sie es entweder zu einem Maven-Projekt machen und es erstellen oder es so installieren, wie Sie es anscheinend bereits getan haben.


Wenn sie jedoch voneinander abhängig sind, können Sie jederzeit ein separates übergeordnetes Projekt erstellen (muss ein "pom" -Projekt sein), das die beiden anderen Projekte als "Module" deklariert. (Die untergeordneten Projekte müssten das dritte Projekt nicht als übergeordnetes Projekt deklarieren.) Infolgedessen erhalten Sie ein neues Verzeichnis für das neue übergeordnete Projekt, in das Sie wahrscheinlich auch die beiden unabhängigen Projekte wie folgt einfügen:

parent
|- pom.xml
|- MyEJBProject
|   `- pom.xml
`- MyWarProject
    `- pom.xml

Das übergeordnete Projekt würde einen Abschnitt "Module" erhalten, in dem alle untergeordneten Module benannt werden. Der Aggregator würde dann die Abhängigkeiten in den untergeordneten Modulen verwenden, um tatsächlich die Reihenfolge herauszufinden, in der die Projekte erstellt werden sollen.

<project>
   ...
   <artifactId>myparentproject</artifactId>
   <groupId>...</groupId>
   <version>...</version>

   <packaging>pom</packaging>
   ...
   <modules>
     <module>MyEJBModule</module>
     <module>MyWarModule</module>
   </modules>
   ...
</project>

Auf diese Weise können die Projekte miteinander in Beziehung stehen, aber (sobald sie im lokalen Repository installiert sind) weiterhin unabhängig als Artefakte in anderen Projekten verwendet werden


Wenn sich Ihre Projekte nicht in verwandten Verzeichnissen befinden, können Sie versuchen, sie als relative Module anzugeben:

filesystem
 |- mywarproject
 |   `pom.xml
 |- myejbproject
 |   `pom.xml
 `- parent
     `pom.xml

Jetzt können Sie dies einfach tun (in Maven 2 gearbeitet, es einfach ausprobiert):

<!--parent-->
<project>
  <modules>
    <module>../mywarproject</module>
    <module>../myejbproject</module>
  </modules>
</project>
Simon Hellinger
quelle
Hallo Simon, ja, wie Sie sagten, können wir das übergeordnete Projekt mit "pom" erstellen und die anderen beiden unter das übergeordnete Projekt verschieben. Leider kann ich dies nicht tun, da wir diese beiden Projekte derzeit bereits als separate Projekte im CVS haben, deren Struktur ich nicht ändern kann. Wenn ich das durch eine POM-Datei bewältigen kann, ist dies das, wonach ich suche.
kds
Sie können Ihre Frage mit diesen zusätzlichen Informationen bearbeiten, die Sie gerade in Ihrem Kommentar angegeben haben: Dies könnte Ihr Problem für andere klären, die versuchen zu antworten!
Simon Hellinger
Nur als letztes Mittel, wenn nichts anderes hilft: Könnten Sie sie nicht einfach aus CVS in das entsprechende Unterverzeichnis Ihres lokalen Dateisystems auschecken, da sie bereits getrennt sind? Checken Sie MyEJBProject in das Verzeichnis "parent / myejbproject" und MyWarProject in "parent / mywarproject" aus. Es ist wahrscheinlich ein Alptraum für die Instandhaltung ...
Simon Hellinger
Danke Simon. Ich habe mich gefragt, was die beste Vorgehensweise ist, um mit solchen Szenarien umzugehen.
kds
Ich habe gerade eine weitere Lösung hinzugefügt, vielleicht könnte dies endlich helfen. Zu Ihrer letzten Frage in den Kommentaren: Ich selbst hatte dieses Szenario eigentlich nie. Wenn wir separate Module erstellen, legen wir diese in einem zentralen Repository (z. B. Sonatype Nexus) ab, damit andere Projekte darauf verweisen können. Sie erstellen also das erste Projekt (z. B. das EJB-Projekt), stellen es bereit und erstellen dann das andere (das Kriegsprojekt) unter Verwendung des bereits erstellten EJB-Projektartefakts und nicht des Maven-Projekts selbst
Simon Hellinger