2010-05-26 13 views
6

मैं एक परियोजना में सभी निर्भरताओं के लिए यूआरएल के साथ एक फ़ाइल उत्पन्न करने के लिए एक मेवेन प्लगइन बनाने की कोशिश कर रहा हूँ। मैं निर्भरता और उनके आर्टिफैक्ट प्राप्त करने में सक्षम हूं, लेकिन मुझे डाउनलोड यूआरएल प्राप्त करने में परेशानी हो रही है।मैवेन एपीआई के माध्यम से आर्टिफैक्ट डाउनलोड यूआरएल कैसे प्राप्त करें?

आर्टिफैक्ट रीसोलवर और आर्टिफैक्टमैटाडाटासोर्स का उपयोग करके मुझे कुछ कलाकृतियों की जानकारी मिलती है। हालांकि मैं सभी निर्भरताओं के लिए सभी जानकारी प्राप्त करने में विफल रहता हूं। मैं रिज़ॉल्यूशन तर्क पर दस्तावेज नहीं ढूंढ पा रहा हूं, ताकि मैं इसे अपनी प्लगइन बना सकूं। मैं आर्टिफैक्ट डाउनलोड करने के लिए आर्टिफैक्ट रीसोलवर का उपयोग कर सकता हूं, लेकिन जो मैं वास्तव में चाहता था वह सिर्फ यूआरएल था।

द मेवेन आर्टिफैक्ट एपीआई में getDownloadURL नामक एक विधि है (http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html देखें)। हालांकि मुझे लगता है कि इसमें वास्तविक मूल्य प्राप्त करने का कोई तरीका नहीं है। मैं हमेशा एक शून्य मूल्य मिलता है। क्या इसे हल करने (डाउनलोड करने या नहीं) करने का कोई तरीका है और फ़ाइल कहां से आई है, इसके लिए यूआरएल प्राप्त करें?

उत्तर

5

मुझे यह मानना ​​है कि मेरे पास कभी ने एक मेवेन प्लगइन लिखा है और आपका प्रश्न एक अच्छा सीखने के अभ्यास के रूप में देखा है। मैंने Maven Guide to Developing Java Plugins से भारी उधार लिया और maven-dependency-plugin से स्रोत कोड उधार लिया।

मैं इसके बारे में गलत हो सकता हूं लेकिन मुझे नहीं लगता कि आर्टिफैक्ट और रिपोजिटरी के बीच सीधी मैपिंग है जो मैवेन द्वारा कहीं भी संग्रहीत है।

मैं कुछ समय के लिए एक मेवेन उपयोगकर्ता रहा हूं और आप अक्सर दिए गए आर्टिफैक्ट के स्थान का पता लगाने के लिए हर रिमोट रिपोजिटरी से पूछताछ मेवेन देखते हैं। इसलिए, नीचे दिए गए मेरे कोड में आपको एक आर्टिफैक्ट के लिए एक ही यूआरएल नहीं मिलेगा, आपको रिमोट रिपोजिटरी के रूप में कई यूआरएल मिलेगा। आप आर्टिफैक्ट डाउनलोड करने और डाउनलोड सफल होने वाले यूआरएल को बनाए रखने के प्रयास के लिए हमेशा इस कोड का विस्तार कर सकते हैं।

मुझे आशा है कि इस मदद करता है।

package sample.plugin; 

import java.util.List; 
import java.util.Set; 
import org.apache.maven.artifact.Artifact; 
import org.apache.maven.artifact.factory.ArtifactFactory; 
import org.apache.maven.artifact.repository.ArtifactRepository; 
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; 
import org.apache.maven.artifact.resolver.ArtifactResolutionException; 
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; 
import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.project.MavenProject; 
import org.apache.maven.project.MavenProjectBuilder; 
import org.apache.maven.project.ProjectBuildingException; 
import org.apache.maven.project.artifact.InvalidDependencyVersionException; 

/** 
* Says "Hi" to the user. 
* @goal sayhi 
*/ 
public class GreetingMojo extends AbstractMojo { 

    /** 
    * @parameter expression="${localRepository}" 
    * @readonly 
    * @required 
    */ 
    protected ArtifactRepository local; 
    /** 
    * @parameter expression="${project.remoteArtifactRepositories}" 
    * @readonly 
    * @required 
    */ 
    protected List<ArtifactRepository> remoteRepos; 
    /** 
    * @component role="org.apache.maven.project.MavenProjectBuilder" 
    * @required 
    * @readonly 
    */ 
    protected MavenProjectBuilder mavenProjectBuilder; 
    /** 
    * @component 
    */ 
    protected ArtifactFactory factory; 
    /** 
    * @component 
    */ 
    protected MavenProject project; 

    public void execute() throws MojoExecutionException { 
     try { 
      resolveDependencies(project); 
     } catch (Exception ex) { 
      getLog().error(ex); 
     } 
    } 

    private void resolveDependencies(MavenProject theProject) 
      throws ArtifactResolutionException, ArtifactNotFoundException, InvalidDependencyVersionException, ProjectBuildingException { 
     Set<Artifact> artifacts = theProject.createArtifacts(this.factory, Artifact.SCOPE_TEST, 
       new ScopeArtifactFilter(Artifact.SCOPE_TEST)); 
     for (Artifact a : artifacts) { 
      System.out.printf("%s : %s : %s\n", a.getGroupId(), a.getArtifactId(), a.getVersion()); 
      for (ArtifactRepository r : remoteRepos) { 
       System.out.printf("%s/%s\n", r.getUrl(), r.pathOf(a)); 
      } 
      System.out.println(); 
      Artifact pomArtifact = this.factory.createArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion(), "", "pom"); 
      MavenProject pomProject = mavenProjectBuilder.buildFromRepository(pomArtifact, remoteRepos, local); 
      resolveDependencies(pomProject); 
     } 
    } 
} 
+0

यह सही दिशा में एक कदम है। मुझे अभी भी अंतिम पता नहीं मिला है, लेकिन कम से कम मुझे वैध उम्मीदवारों की एक सूची मिलती है। मुझे अपने उदाहरण पर मेवेनप्रोजेक्ट घटक के साथ कोई समस्या थी (इसे ठीक करने के लिए @parameter अभिव्यक्ति = "$ {project}" जोड़ना था)। – Thomas

+0

मैवेन एपीआई का संस्करण 2.2.1 इंगित करता है कि आर्टिफैक्ट इंटरफेस एक आर्टिफैक्ट रिपोजिटरी वापस कर सकता है और आर्टिफैक्ट रिपोजिटरी इंटरफ़ेस में getUrl फ़ंक्शन है। उम्मीद है कि यह एक लाल हेरिंग^_^नहीं है – Thirlan

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

  • कोई संबंधित समस्या नहीं^_^