2012-12-26 8 views
7

Tworzę wtyczkę Mavena z dość unikatowym warunkiem prawidłowego działania: musi ona odradzać nowe procesy, a następnie czekać na wykonanie tych procesów.Proces rozwidlenia wtyczki Mavena z właściwą ścieżką Classpatha

Mimo że jest to dość trywialne zadanie w linii poleceń, wtyczki Maven nie są wywoływane w taki sam sposób, jak tradycyjny kod Java i dlatego nie ma ścieżki klasy. Nie mogę się dowiedzieć, jak rozwiązać właściwą ścieżkę klas wewnątrz wtyczki, tak, że mogę odrodzić nową maszynę JVM (wywołując metodę Main innej klasy wewnątrz wtyczki).

Korzystanie obecny artefaktu MavenProject jestem w stanie uzyskać Artifact odniesienie do siebie (plugin) i dostać to względny katalog wewnątrz lokalnego repozytorium Maven:

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

Jak uzyskać odniesienie do wszystkich jego zależności (i zależności przechodnie), że mogę skonstruować pełną ścieżkę klas dla nowego wywołania? Widzę, że self ma filtr zależności, ale nie wiem, gdzie go zastosować.

Czy to właściwy sposób na stworzenie nowego procesu "siebie" wewnątrz wtyczki? Czy istnieje lepszy sposób?

Odpowiedz

3

znalazłem a great article na różnice między rozdzielczości zależność od Maven 2 i Maven 3.

Biorąc pod uwagę Artifact sprowadza się do następujących:

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

z Set można skonstruować poprzez wywołanie pathOf na ArtifactRepository dla każdego elementu i dołączenie do File.pathSeparator.

1

Hm. Naprawdę nie jest to odpowiedź, ale pewne wskazówki. Dlaczego potrzebujesz tak złożonej rzeczy? Co więcej, zagłębiłbym się we wtyczkę maven-surefire, która może rozwidlić jvm dla testów jednostkowych i poradzić sobie ze ścieżką klasy. Z drugiej strony możesz rzucić okiem na maven-invoker lub maven-invoker-plugin, który może całkowicie rozwidlić maven. Ah..co tęskniłem. Zajrzyj do maven-dependency-plugin, która ma szczególny cel do stworzenia ścieżki klasy, w której możesz zajrzeć do źródeł, jak budować ścieżkę klas.

+0

Usługa innej firmy, z którą współpracuję, pozwala tylko na jedno połączenie na proces i wykonanie ich seryjnie nie jest opcją. Będę potrzebował od 5 do 20 interakcji w jednym uruchomieniu tej wtyczki. Zbadam Twoje sugestie później, dzięki. –

Powiązane problemy