2012-12-26 11 views
7

मैं उचित ऑपरेशन के लिए एक अनूठी आवश्यकता के साथ एक मेवेन प्लगइन बना रहा हूं: इसे स्वयं की नई प्रक्रियाओं को विकसित करने की आवश्यकता है और फिर उन प्रक्रियाओं को कार्य पूरा करने की प्रतीक्षा करें।उचित कक्षा के साथ मेवेन प्लगइन फोर्क प्रक्रिया

हालांकि यह कमांड लाइन पर अपेक्षाकृत मामूली है, मैवेन प्लगइन्स पारंपरिक जावा कोड के समान तरीके से नहीं आते हैं और इस प्रकार कोई क्लासपाथ नहीं है। मैं यह नहीं समझ सकता कि प्लगइन के अंदर सही क्लासपाथ को कैसे हल किया जाए, जैसे कि मैं एक नया जेवीएम (प्लगइन के अंदर किसी अन्य वर्ग की मुख्य विधि का आह्वान) कर सकता हूं।

का उपयोग करते हुए वर्तमान विरूपण साक्ष्य के MavenProject मैं अपने आप को (प्लगइन) के लिए एक Artifact संदर्भ मिलता है और यह स्थानीय 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; 
    } 
} 

मैं कैसे के सभी के लिए एक संदर्भ मिलता है इसकी निर्भरता (और संक्रमणीय निर्भरता) जैसे कि मैं एक नए आवेदक के लिए एक पूर्ण कक्षा का निर्माण कर सकता हूं? मुझे लगता है कि self पर एक निर्भरता फ़िल्टर है लेकिन मुझे नहीं पता कि इसे कहां लागू करना है।

क्या यह प्लगइन के अंदर "खुद" की एक नई प्रक्रिया बनाने का उचित तरीका है? क्या कोई बेहतर तरीका है?

उत्तर

3

मैं Maven 2 और Maven 3.

पर निर्भरता संकल्प के बीच मतभेदों पर a great article पाया एक Artifact को देखते हुए यह निम्न करने पर निर्भर करता:

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

Set आपको कॉल करके एक निर्माण कर सकते हैं प्रत्येक तत्व के लिए ArtifactRepository पर pathOf और File.pathSeparator के साथ जुड़ना।

1

एचएम। वास्तव में एक जवाब नहीं बल्कि कुछ संकेत। आपको ऐसी जटिल चीज़ की आवश्यकता क्यों है? इसके अलावा मैं maven-surefire-plugin में गहराई से देखता हूं जो यूनिट परीक्षणों के लिए एक जेवीएम फोर्क कर सकता है और क्लासपाथ को संभाल सकता है। दूसरी तरफ आप maven-invoker या maven-invoker-plugin में देख सकते हैं जो कि पूरी तरह से कांटा जा सकता है। आह .. जो मुझे याद आया। maven-dependency-plugin पर एक नज़र डालें, जिसमें क्लासपाथ बनाने के लिए एक विशेष लक्ष्य है जहां आप स्रोतों को देख सकते हैं कि वे क्लासपाथ कैसे बनाते हैं।

+0

एक तृतीय-पक्ष सेवा जिसके साथ मैं बातचीत कर रहा हूं केवल एक कनेक्शन प्रति-प्रक्रिया की अनुमति देता है और उन्हें क्रमशः निष्पादित करने का विकल्प नहीं है। मुझे इस प्लगइन के एक रन में 5 से 20 इंटरैक्शन से कहीं भी होना चाहिए। मैं बाद में आपके सुझावों की जांच करूंगा, धन्यवाद। –

संबंधित मुद्दे