2012-06-11 35 views
1

ClassNotFoundException正在我開發的插件中拋出。不能founf類肯定存在,且其關聯的項目作爲執行的pom.xml的依賴如下包括:當在Mojo中使用@requiresDependencyResolution時,調試ClassNotFoundException拋出我的Maven 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 –