Ich schreibe ein Maven-Plugin, das die aufgelösten Abhängigkeiten erhält. Es funktioniert gut für ein einzelnes Modulprojekt/Pom, aber scheitert bei mehreren Modulprojekten.Wie lösen Sie Abhängigkeiten zwischen allen Modulen in einem Maven-Plugin auf?
Hier ist ein Code
@Mojo(
name="scan",
aggregator = true,
defaultPhase = LifecyclePhase.COMPILE,
threadSafe = true,
requiresDependencyCollection = ResolutionScope.TEST,
requiresDependencyResolution = ResolutionScope.TEST,
requiresOnline = true
)
public class MyMojo extends AbstractMojo {
@Parameter(property = "project", required = true, readonly = true)
private MavenProject project;
@Parameter(property = "reactorProjects", required = true, readonly = true)
private List<MavenProject> reactorProjects;
@Override
public void execute() throws MojoExecutionException {
for(MavenProject p : reactorProjects) {
for(Artifact a : p.getArtifacts()) {
...consolidate artifacts
}
}
}
}
Der obige Code wird konsolidieren Snippet alle Abhängigkeiten aufgelöst über alle Module, aber es enthält einige zusätzliche diejenigen.
Hier ist ein Beispielprojekt, mit dem Sie arbeiten können. Bitte laden Sie this github repo
aus den Modulen Projekthauptordner, führen Sie bitte
mvn dependency:tree -Dverbose -Dincludes=commons-logging
Sie sollten eine Ausgabe wie diese
[INFO] ------------------------------------------------------------------------
[INFO] Building core 0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ core ---
[INFO] com.github:core:jar:0.1-SNAPSHOT
[INFO] \- axis:axis:jar:1.4:compile
[INFO] +- commons-logging:commons-logging:jar:1.0.4:runtime
[INFO] \- commons-discovery:commons-discovery:jar:0.2:runtime
[INFO] \- (commons-logging:commons-logging:jar:1.0.3:runtime - omitted for conflict with 1.0.4)
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building web 0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ web ---
[INFO] com.github:web:war:0.1-SNAPSHOT
[INFO] +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] \- com.github:core:jar:0.1-SNAPSHOT:compile
[INFO] \- axis:axis:jar:1.4:compile
[INFO] +- (commons-logging:commons-logging:jar:1.0.4:runtime - omitted for conflict with 1.1.1)
[INFO] \- commons-discovery:commons-discovery:jar:0.2:runtime
[INFO] \- (commons-logging:commons-logging:jar:1.0.3:runtime - omitted for conflict with 1.1.1)
[INFO] ------------------------------------------------------------------------
Hinweis sehen, dass das Modul/Projekt Kern auf commons hängt -logging 1.0.4 und commons-logging 1.0.3, aber 1.0.3 wird aufgrund eines Konflikts ausgelassen und 1.0.4 ist behoben. Dies bedeutet, dass wenn Sie Core allein erstellen sollten, sollten Sie nur Commons-Logging 1.0.4 bekommen.
Beachten Sie, dass das Modul/Projekt web auch von widersprüchlichen Versionen von Commons-Logging abhängig ist, aber zu 1.1.1 aufgelöst wird.
Wenn Sie jetzt das "gesamte Projekt" (Module-Projekt) mit dem Befehl "mvn package" erstellen, sollten Sie sehen, dass modules-project/web/target/myweb/WEB-INF/lib alle enthält aufgelöste Abhängigkeiten und es enthält ONLY commons-logging 1.1.1.
Hier ist das Problem mit dem Code
In dem obigen Code wird reactorProjects mit 3 MavenProject der instanziiert: Module-Projekt, Kern und Web.
Für Module-Projekt und Web, löst und gibt commons-logging 1.1.1 zurück. Für das Projekt core löst es jedoch commons-logging 1.0.4 auf und gibt es zurück.
Ich möchte mein Plugin-Code wissen, dass commons-logging 1.1.1 die Abhängigkeit ist, dass der Build zu produzieren, und nicht die commons-logging 1.0.4
Irgendwelche Gedanken?
Was ist der Zweck dieses Plugins? Was möchtest du erreichen? – khmarbaise
Ich möchte nur alle Abhängigkeiten erhalten, die "mvn package" – kane
erzeugen würde. Sie sollten das maven-assembly-plugin verwenden, das bereits solche Dinge tun kann ... Abgesehen davon, dass Sie die Abhängigkeiten erhalten möchten, war klar basierend auf der Frage, aber was ist nicht klar ist, warum brauchen Sie sie? – khmarbaise