2009-05-16 16 views
13

Yansımayı kullanması gereken bir maven eklentisi yapmaya çalışıyorum. Eklentiyi çalıştırmak ve projedeki bir sınıfın tam adını vermek için bir proje istiyorum ve eklenti, bilgi almak için yansımayla onu yükleyecek. classloader ile garip bir şey benMaven eklentisi sınıf yüklenemiyor

Class.forName("package.MyClass"); 

here Looking kullandığınızda sınıf bulamadığından benim eklentinin classloader, ne zaman bir de yürütülüyor ise, oldukça çözemiyorum olsa var

Farklı proje, bu projenin sınıflarına erişebilir.

cevap

11

daha iyi bir yolu olmadığına emin değilim, ama işe aldım nasıl burada:

mojo üstündeki javadoc ekleyin: @requiresDependencyResolution çalışma zamanı

bir MavenProject ekle parametresi:

/** 
* @parameter expression="${project}" 
* @required 
* @readonly 
*/ 
private MavenProject project; 

Sonra zamanında bağımlılıkları almak ve kendi classloader yapabilirsiniz:

List runtimeClasspathElements = project.getRuntimeClasspathElements(); 
URL[] runtimeUrls = new URL[runtimeClasspathElements.size()]; 
for (int i = 0; i < runtimeClasspathElements.size(); i++) { 
    String element = (String) runtimeClasspathElements.get(i); 
    runtimeUrls[i] = new File(element).toURI().toURL(); 
} 
URLClassLoader newLoader = new URLClassLoader(runtimeUrls, 
    Thread.currentThread().getContextClassLoader()); 

Sonra bu yeni classloader kullanarak sınıfını yükleyebilirsiniz:

Class bundle = newLoader.loadClass("package.MyClass"); 
11

Geçerli sınıf alemine çalışma zamanı sınıf yol öğelerini eklemek için bu kullanmayı düşünmelisiniz. (Sen sınıf krallığını almak için PluginDescriptor kullanabilirsiniz

List<String> runtimeClasspathElements = project.getRuntimeClasspathElements(); 
ClassRealm realm = descriptor.getClassRealm(); 

for (String element : runtimeClasspathElements) 
{ 
    File elementFile = new File(element); 
    realm.addURL(elementFile.toURI().toURL()); 
} 

Bu benim için mükemmel çalıştı

Dave sordu gibi burada PluginDescriptor almak için bir yoldur.!

/** 
* The plugin descriptor 
* 
* @parameter default-value="${descriptor}" 
*/ 
private PluginDescriptor descriptor; 
+0

MyMojo'nun yürütme yönteminin içinden PluginDescriptor'a nasıl bağlanırsınız? – Upgradingdave

+1

Hey Dave, cevabımı ayarladım, umarım yardımcı olur. (Yansımalar afair ile ayarlandığı için bir ayarlayıcıya ihtiyacınız yoktur). – codevour

+0

Çok teşekkürler, bunu dokümanlarda hiçbir yerde bulamadım. – Upgradingdave

1

I Bu sorunla karşılaştım, bugün, yukarıdaki önerilerim işe yaramadı, benim çözümümüzü listeye gönderebileceğimi düşündüm .. Şu anda görüntülenen HibernateExporter mojo kaynağını kullandım: http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.mojo/hibernate3-maven-plugin/2.2/org/codehaus/mojo/hibernate3/HibernateExporterMojo.java?av=f

Ayrıca, doğru MavenProject sınıfını kullandığınızdan emin olun. Bunu ekleyiniz

<dependency> 
    <groupId>org.apache.maven</groupId> 
    <artifactId>maven-core</artifactId> 
    <version>3.0.3</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.maven</groupId> 
    <artifactId>maven-plugin-api</artifactId> 
    <version>3.0.3</version> 
</dependency> 
1

Bu benim için ve maven3 eklentileri eklenti sınıf yoluna almak için çalıştı.

Eklenti, PluginDescriptor enjekte etmek için @Component kullanmaktır. Aksi takdirde doğru şekilde ayarlanmayacaktır.

@Component 
private MavenProject project; 
@Component 
private PluginDescriptor descriptor; 

private void addDependenciesToClasspath(String artifactId) { 
    for (Artifact artifact : project.getDependencyArtifacts()) { 
     if (artifact.getArtifactId().equals(artifactId)) { 
      try { 
       final URL url = artifact.getFile().toURI().toURL(); 
       final ClassRealm realm = descriptor.getClassRealm(); 
       realm.addURL(url); 
      } 
      catch (MalformedURLException e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
} 
İlgili konular