2012-12-26 11 views
7

Ich erstelle ein Maven Plug-in mit einer ziemlich einzigartigen Anforderung für den korrekten Betrieb: Es muss neue Prozesse von sich selbst erzeugen und dann warten, bis diese Prozesse eine Aufgabe abgeschlossen haben.Maven Plugin Fork Prozess mit korrektem Classpath

Während dies in der Befehlszeile relativ trivial ist, werden Maven-Plugins nicht auf die gleiche Weise wie herkömmlicher Java-Code aufgerufen, und daher gibt es keinen Klassenpfad. Ich kann nicht herausfinden, wie man den richtigen Klassenpfad innerhalb des Plugins löst, so dass ich eine neue JVM erzeugen kann (indem ich die Main-Methode einer anderen Klasse innerhalb des Plugins aufruft).

Mit der aktuellen Artefakts MavenProject Ich bin in der Lage einen Artifact Bezug auf mir (das Plugin) zu bekommen und bekommt es relativ Verzeichnis im lokalen Maven-Repository ist:

Artifact self = null; 
for (Artifact artifact : project.getPluginArtifacts()) { 
    if ("my-group-id".equals(artifact.getGroupId()) && "my-artifact-id".equals(artifact.getArtifactId())) { 
    self = artifact; 
    break; 
    } 
} 
if (self == null) { 
    throw new MojoExecutionException("Could not find representation of this plugin in project."); 
} 
for (ArtifactRepository artifactRepository : project.getPluginArtifactRepositories()) { 
    String path = artifactRepository.pathOf(self); 
    if (path != null) { 
    getLog().info("relative path to self: " + path); 
    break; 
    } 
} 

Wie bekomme ich einen Verweis auf all seine Abhängigkeiten (und transitiven Abhängigkeiten), so dass ich einen vollständigen Klassenpfad für einen neuen Aufruf konstruieren kann? Ich sehe, dass self hat einen Abhängigkeitsfilter, aber ich weiß nicht, wo es anzuwenden ist.

Ist dies der richtige Weg, um einen neuen Prozess von "mir selbst" in einem Plugin zu erstellen? Gibt es einen besseren Weg?

Antwort

3

fand ich a great article auf die Unterschiede zwischen der Auflösung von Abhängigkeiten auf Maven 2 und Maven 3.

ein Artifact Da es läuft darauf hinaus auf die folgenden:

private Set<Artifact> getDependenciesForArtifact(Artifact artifact) { 
    ArtifactResolutionRequest arr = new ArtifactResolutionRequest() 
     .setArtifact(artifact) 
     .setResolveTransitively(true) 
     .setLocalRepository(local); 
    return repositorySystem.resolve(arr).getArtifacts(); 
} 

Mit dem Set Sie können ein Konstrukt durch den Aufruf pathOf auf einem ArtifactRepository für jedes Element und Beitritt mit File.pathSeparator.

1

Hm. Nicht wirklich eine Antwort, aber ein paar Hinweise. Warum brauchst du so ein komplexes Ding? Außerdem würde ich einen Blick in das maven-surefire-plugin werfen, welches einen jvm für Komponententests ausgibt und Klassenpfad verarbeiten kann. Auf der anderen Seite können Sie einen Blick in die maven-invoker oder in die maven-invoker-plugin werfen, die vollständig maven kann. Ah ... was ich verpasst habe. Werfen Sie einen Blick auf die maven-dependency-plugin, die ein besonderes Ziel hat, um den Klassenpfad zu erstellen, wo Sie in die Quellen schauen können, wie sie den Klassenpfad aufbauen.

+0

Ein Dienst von Drittanbietern, mit dem ich zusammenarbeite, erlaubt nur eine Verbindung pro Prozess und die serielle Ausführung ist keine Option. Ich muss irgendwo zwischen 5 und 20 Interaktionen in einem einzigen Durchlauf dieses Plugins haben. Ich werde Ihre Vorschläge später untersuchen, danke. –

Verwandte Themen