2016-02-17 10 views
9

मैं अपनी परियोजना में उपयोग की जाने वाली सभी निर्भरताओं (रिकर्सिव) पर जानकारी निकालने का प्रयास कर रहा हूं। ऐसा लगता है जैसे मेवेनप्रोजेक्ट क्लास मुझे आवश्यक सभी जानकारी प्रदान करता है। लेकिन मैं समझ नहीं कैसे MavenProjectमेवेन प्लगइन एपीआई: आर्टिफैक्ट से मेवेनप्रोजेक्ट प्राप्त करें

/** 
* 
* 
* @reqiresDependencyResolution 
* 
*/ 
@Mojo(name = "license-overview", defaultPhase = LifecyclePhase.PROCESS_SOURCES) 
public class MyMojo extends AbstractMojo { 


    /** 
    * @parameter default-value="${project}" 
    * @required 
    * @readonly 
    */ 
    MavenProject project; 


    public void execute() throws MojoExecutionException { 

     Set<Artifact> artifacts= project.getArtifacts(); 
     for (Artifact artifact : artifacts) { 
      //Here I need to access the artifact's name, license, author, etc. 
      System.out.println("*** "+artifact.getArtifactId()+"***"); 
     } 

    } 
} 

कैसे जानकारी है कि मेरी निर्भरता के पोम के भीतर स्थित है तक पहुँचने के लिए की एक आवृत्ति में Artifact का एक उदाहरण को बदलने के लिए है, लेकिन Artifact रों ही टिककर खेल के माध्यम से निर्यात नहीं कर रहा है ?

उत्तर

8

हां, यह संभव है।

हम ProjectBuilder एपीआई के साथ में स्मृति एक परियोजना का निर्माण कर सकते हैं:

बनाता है परियोजनाओं के इन-स्मृति विवरण।

विरूपण साक्ष्य हम में रुचि रखते हैं के साथ build(projectArtifact, request) विधि और लागू करके एक ProjectBuildingRequest (जो दूरस्थ/स्थानीय खजाने, आदि के स्थान की तरह विभिन्न मापदंडों रखती है), इस में स्मृति एक MavenProject का निर्माण करेगा।

  • requiresDependencyResolution बताता Maven है कि हम करने के लिए निर्भरता की आवश्यकता होती है:

    @Mojo(name = "foo", requiresDependencyResolution = ResolutionScope.RUNTIME) 
    public class MyMojo extends AbstractMojo { 
    
        @Parameter(defaultValue = "${project}", readonly = true, required = true) 
        private MavenProject project; 
    
        @Parameter(defaultValue = "${session}", readonly = true, required = true) 
        private MavenSession session; 
    
        @Component 
        private ProjectBuilder projectBuilder; 
    
        public void execute() throws MojoExecutionException, MojoFailureException { 
         ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); 
         try { 
          for (Artifact artifact : project.getArtifacts()) { 
           buildingRequest.setProject(null); 
           MavenProject mavenProject = projectBuilder.build(artifact, buildingRequest).getProject(); 
           System.out.println(mavenProject.getName()); 
          } 
         } catch (ProjectBuildingException e) { 
          throw new MojoExecutionException("Error while building project", e); 
         } 
        } 
    
    } 
    

    यहाँ मुख्य तत्व के एक जोड़े हैं:

    निम्नलिखित मोजो कि सभी निर्भरता के नाम प्रिंट होगा पर विचार करें निष्पादन से पहले हल किया जाना चाहिए। इस मामले में, मैंने इसे RUNTIME पर निर्दिष्ट किया ताकि सभी संकलन और रनटाइम निर्भरता हल हो जाएं। आप निश्चित रूप से ResolutionScope पर सेट कर सकते हैं। तुम्हें चाहिए।

  • प्रोजेक्ट बिल्डर को @Component एनोटेशन के साथ इंजेक्शन दिया गया है।
  • वर्तमान मेवेन सत्र के पैरामीटर के साथ एक डिफ़ॉल्ट बिल्डिंग अनुरोध बनाया गया है। हमें वर्तमान प्रोजेक्ट को null पर स्पष्ट रूप से सेट करके वर्तमान प्रोजेक्ट को ओवरराइड करना होगा, अन्यथा कुछ भी नहीं होगा।

जब आप MavenProject की पहुंच है, तो आप सभी जानकारी आप इसके बारे में चाहते हैं, डेवलपर्स की तरह, आदि मुद्रित कर सकते हैं

आप (प्रत्यक्ष और सकर्मक) निर्भरता मुद्रित करने के लिए, आप चाहते हैं इमारत अनुरोध पर setResolveDependencies(true) को भी आमंत्रित करने की आवश्यकता है, अन्यथा, वे निर्मित परियोजना में नहीं आ जाएंगे।

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