2012-06-11 10 views
1

КлассNotFoundException генерируется в плагине, который я разработал. Класс, который не может быть founf определенно существует, и связанный с ним проект включен в зависимости в файле pom.xml Исполнит проект следующим образом:Отладка ClassNotFoundException бросает мой Maven Mojo при использовании @requiresDependencyResolution в Mojo

<dependency> 
    <groupId>com.example</groupId> 
    <artifactId>project-one</artifactId> 
<version>1.0-SNAPSHOT</version> 
</dependency> 

Моего плагин включена выполняющей pom.xml следующим образом:

<build> 
<plugins> 
<plugin> 
    <groupId>com.example</groupId> 
       <artifactId>project-two-plugin</artifactId> 
       <version>1.0</version> 
       <executions> 
        <execution> 
         <configuration> 
          <customSettingOne> 
           setting 
          </customSettingOne> 
         </configuration> 
         <phase>prepare-package</phase> 
         <goals> 
          <goal>some-task</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

     </plugins> 
    </build> 

Мой класс плагин следующим образом:

/** 
* @goal some-task 
* 
* @requiresDependencyResolution compile 
*/ 

public class MyPluginMojo extends AbstractMojo { 

    /** 
    * Directory to save the CSV files to. 
    * 
    * @parameter alias="customSettingOne" 
    * @required 
    */ 
    private File customSettingOne; 

} 

Я попробовал этот код с помощью:

Apache Maven 2.2.1 (r801777; 2009-08-06 20:16:01+0100) 

и встроенная версия используется Eclipse, m2e

Embedded (3.0.2/1.0.200.20111228-1245 

Я получаю ClassNotFoundException, когда мой код плагина пытался загрузить класс из ProjectOne.

У кого-нибудь есть идеи, как я могу разобраться в этом? Можно ли проверять или выгружать путь к классам, который используется в плагине?

ответ

5

Я хотел бы проверить здесь первым:

Guide to Maven Classloading

и если это не поможет, возможно, немного диагностического кода вроде следующего:

package stackoverflow; 

import java.net.URL; 
import java.net.URLClassLoader; 

public class PrintClassLoader { 
    public static void main(String[] args) { 
     PrintClassLoader pcl = new PrintClassLoader(); 
     pcl.printClassLoader(pcl.getClass().getClassLoader()); 
    } 

    public void printClassLoader(ClassLoader classLoader) { 
     if (null == classLoader) { 
      return; 
     } 
     System.out.println("--------------------"); 
     System.out.println(classLoader); 
     if (classLoader instanceof URLClassLoader) { 
      URLClassLoader ucl = (URLClassLoader) classLoader; 
      int i = 0; 
      for (URL url : ucl.getURLs()) { 
       System.out.println("url[" + (i++) + "]=" + url); 
      } 
     } 
     printClassLoader(classLoader.getParent()); 
    } 
} 

Например напечатает что-то вроде :

-------------------- 
[email protected] 
url[0]=file:/D:/dev/workspaces/3.6/all/Z_temp/target/classes/ 
url[1]=file:/D:/dev/.m2/repository/javax/mail/mail/1.4/mail-1.4.jar 
url[2]=file:/D:/dev/.m2/repository/javax/activation/activation/1.1/activation-1.1.jar 
url[3]=file:/D:/dev/.m2/repository/commons-io/commons-io/2.1/commons-io-2.1.jar 
-------------------- 
[email protected] 
url[0]=file:/C:/java/jdk/jdk1.6.0_31/jre/lib/ext/dnsns.jar 
url[1]=file:/C:/java/jdk/jdk1.6.0_31/jre/lib/ext/localedata.jar 
url[2]=file:/C:/java/jdk/jdk1.6.0_31/jre/lib/ext/sunjce_provider.jar 
url[3]=file:/C:/java/jdk/jdk1.6.0_31/jre/lib/ext/sunmscapi.jar 
url[4]=file:/C:/java/jdk/jdk1.6.0_31/jre/lib/ext/sunpkcs11.jar 
+0

Спасибо! Документация помогла: в частности, раздел 3. – auser

+2

Руководство по загрузке классов maven3: https://cwiki.apache.org/confluence/display/MAVEN/Maven+3.x+Class+Loading –

Смежные вопросы