2012-12-26 11 views
7

Sto creando un plug-in Maven con un requisito univoco per il corretto funzionamento: è necessario generare nuovi processi di se stesso e quindi attendere che tali processi completino un'attività.Processo forcella Maven con percorso classe corretto

Mentre questo è relativamente banale da eseguire sulla riga di comando, i plugin Maven non vengono richiamati nello stesso modo del codice Java tradizionale e quindi non esiste alcun classpath. Non riesco a capire come risolvere il classpath corretto all'interno del plugin in modo da poter generare una nuova JVM (invocando il metodo Main di un'altra classe all'interno del plugin).

Usando del MavenProject sono in grado di ottenere un Artifact riferimento a me stesso (il plugin) e ottenere è directory relativa all'interno del repository Maven locale artefatto corrente:

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

Come faccio ad avere un punto di riferimento a tutti le sue dipendenze (e le dipendenze transitive) tali che io possa costruire un percorso di classe completo per una nuova invocazione? Vedo che self ha un filtro dipendenza ma non so dove applicarlo.

È questo il modo corretto di creare un nuovo processo di "me stesso" all'interno di un plug-in? C'è un modo migliore?

risposta

3

ho trovato a great article sulle differenze tra risoluzione dipendenza Maven 2 e Maven 3.

Dato un Artifact si riduce a quanto segue:

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

Con il Set è possibile costruire un chiamando pathOf su un ArtifactRepository per ogni elemento e unendo con File.pathSeparator.

1

Hm. Non è davvero una risposta, ma alcuni suggerimenti. Perché hai bisogno di una cosa così complessa? Inoltre vorrei dare uno sguardo approfondito al plugin maven-surefire che può lanciare un jvm per i test unitari e può gestire classpath. D'altra parte è possibile dare un'occhiata allo maven-invoker o allo maven-invoker-plugin che può forgiare completamente il Maven. Ah ... quello che ho perso. Dai uno sguardo allo maven-dependency-plugin che ha un obiettivo particolare per la creazione del classpath in cui puoi dare un'occhiata alle fonti su come costruiscono il classpath.

+0

Un servizio di terze parti con cui sto interagendo consente solo una connessione per processo ed eseguirli in serie non è un'opzione. Avrò bisogno di avere da 5 a 20 interazioni in una singola esecuzione di questo plugin. Indagherò i tuoi suggerimenti più tardi, grazie. –

Problemi correlati