2014-01-16 67 views
8

當我嘗試測試我的Maven插件我得到以下錯誤:無法測試Maven插件(ClassNotFound的 - ArtifactTransformationManager)

WARNING: Error injecting: org.apache.maven.repository.legacy.LegacyRepositorySystem 
com.google.inject.ProvisionException: Guice provision errors: 

1) Error injecting: org.apache.maven.artifact.resolver.DefaultArtifactResolver 
    at ClassRealm[plexus.core, parent: null] 
    at ClassRealm[plexus.core, parent: null] 
    while locating org.apache.maven.artifact.resolver.ArtifactResolver 
    while locating org.apache.maven.repository.legacy.LegacyRepositorySystem 

1 error 
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:977) 
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1003) 
at org.sonatype.guice.bean.reflect.AbstractDeferredClass.get(AbstractDeferredClass.java:47) 
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) 
at com.google.inject.Scopes$1$1.get(Scopes.java:59) 
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) 
at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:968) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1014) 
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:964) 
at org.sonatype.guice.bean.locators.LazyBeanEntry.getValue(LazyBeanEntry.java:79) 
at org.sonatype.guice.plexus.locators.LazyPlexusBean.getValue(LazyPlexusBean.java:53) 
at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:243) 
at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:235) 
at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:229) 
at org.codehaus.plexus.PlexusTestCase.lookup(PlexusTestCase.java:206) 
at org.apache.maven.plugin.testing.AbstractMojoTestCase.setUp(AbstractMojoTestCase.java:118) 
at junit.framework.TestCase.runBare(TestCase.java:125) 
at junit.framework.TestResult$1.protect(TestResult.java:106) 
at junit.framework.TestResult.runProtected(TestResult.java:124) 
at junit.framework.TestResult.run(TestResult.java:109) 
at junit.framework.TestCase.run(TestCase.java:118) 
at junit.framework.TestSuite.runTest(TestSuite.java:208) 
at junit.framework.TestSuite.run(TestSuite.java:203) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213) 
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) 
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) 
at org.apache.maven.surefire.Surefire.run(Surefire.java:177) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) 
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) 
Caused by: java.lang.NoClassDefFoundError: Lorg/apache/maven/artifact/transform/ArtifactTransformationManager; 
at java.lang.Class.getDeclaredFields0(Native Method) 
at java.lang.Class.privateGetDeclaredFields(Class.java:2300) 
at java.lang.Class.getDeclaredFields(Class.java:1745) 
at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:649) 
at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356) 
at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:151) 
at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:584) 
at com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:542) 
at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:528) 
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:837) 
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:769) 
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:254) 
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205) 
at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:843) 
at com.google.inject.internal.InjectorImpl.getProviderOrThrow(InjectorImpl.java:957) 
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:990) 
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:951) 
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1003) 
at org.sonatype.guice.bean.reflect.AbstractDeferredClass.get(AbstractDeferredClass.java:47) 
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) 
at com.google.inject.Scopes$1$1.get(Scopes.java:59) 
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) 
at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:968) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021) 
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:964) 
at org.sonatype.guice.bean.locators.LazyBeanEntry.getValue(LazyBeanEntry.java:79) 
at org.sonatype.guice.plexus.locators.LazyPlexusBean.getValue(LazyPlexusBean.java:53) 
at org.sonatype.guice.plexus.binders.PlexusRequirements$RequirementProvider.get(PlexusRequirements.java:221) 
at org.sonatype.guice.plexus.binders.ProvidedPropertyBinding.injectProperty(ProvidedPropertyBinding.java:49) 
at org.sonatype.guice.bean.inject.BeanInjector.doInjection(BeanInjector.java:105) 
at org.sonatype.guice.bean.inject.BeanInjector.injectMembers(BeanInjector.java:66) 
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:120) 
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:94) 
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 
at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:968) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021) 
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:964) 
... 39 more 
Caused by: java.lang.ClassNotFoundException: org.apache.maven.artifact.transform.ArtifactTransformationManager 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
... 79 more 

該項目的POM:

<dependencies> 

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

    <dependency> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-eclipse-plugin</artifactId> 
     <version>2.9</version> 
    </dependency> 

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

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

    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-exec</artifactId> 
     <version>1.1</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.maven.plugin-testing</groupId> 
     <artifactId>maven-plugin-testing-harness</artifactId> 
     <version>2.1</version> 
     <scope>test</scope> 
    </dependency> 

</dependencies> 


<build> 
    <plugins> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <version>2.9</version> 
      <configuration> 
       <additionalConfig> 
        <file> 
         <name>.checkstyle</name> 
         <location>../config/eclipse-checkstyle-config.xml</location> 
        </file> 
       </additionalConfig> 
      </configuration> 
     </plugin> 

    </plugins> 

</build> 

我試圖找到缺少類的工件(org.apache.maven.artifact.transform.ArtifactTransformationManager),它看起來像是maven-artifact工件,但它不會改變任何東西。

這裏的測試:

package com.example; 

import java.io.File; 

import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.MojoFailureException; 
import org.apache.maven.plugin.testing.AbstractMojoTestCase; 

public class MyMojoTest extends AbstractMojoTestCase 
{ 

    private static final String PROJECT_TO_TEST_ROOT_PATH = "src/test/resources/unit/project-to-test"; 

    private static final String PROJECT_TO_TEST_ROOT_POM_PATH = PROJECT_TO_TEST_ROOT_PATH + "/pom.xml"; 

    public void testHistoryFilesAreGeneratedInFoldersWithScriptFiles() throws Exception 
    { 
     executeGenerateHistoryMojo(PROJECT_TO_TEST_ROOT_POM_PATH); 
     assertHistoryFileGenerated("t1"); 
    } 

    public void testHistoryFilesAreNotGeneratedInFoldersWithNoScriptFiles() throws Exception 
    { 
     executeGenerateHistoryMojo(PROJECT_TO_TEST_ROOT_POM_PATH); 
     assertHistoryFileNotGenerated("t4"); 
    } 

    private void assertHistoryFileGenerated(String relativePath) 
    { 
     String fullPath = PROJECT_TO_TEST_ROOT_PATH + "/" + relativePath; 
     assertTrue("History file has not been generated in " + fullPath, doesHistoryFileExistIn(fullPath)); 
    } 

    private void assertHistoryFileNotGenerated(String relativePath) 
    { 
     String fullPath = PROJECT_TO_TEST_ROOT_PATH + "/" + relativePath; 
     assertTrue("History file has not been generated in " + fullPath, doesHistoryFileExistIn(fullPath)); 
    } 

    private boolean doesHistoryFileExistIn(String string) 
    { 
     return false; 
    } 

    private void executeGenerateHistoryMojo(String directoryRoot) throws Exception, MojoExecutionException, MojoFailureException 
    { 
     File pom = getTestFile(directoryRoot); 
     assertNotNull(pom); 
     assertTrue(pom.exists()); 
     MyMojo myMojo = (MyMojo) lookupMojo("my-mojo", pom); 
     assertNotNull(myMojo); 
     myMojo.execute(); 
    } 

} 

和插件代碼:

package com.example; 

import java.io.File; 
import java.io.FileFilter; 
import java.io.IOException; 

import org.apache.commons.io.FileUtils; 
import org.apache.commons.io.filefilter.DirectoryFileFilter; 
import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.MojoFailureException; 
import org.apache.maven.project.MavenProject; 

/** 
* @goal my-mojo 
* @execute phase="generate-resources" 
*/ 
public class MyMojo extends AbstractMojo 
{ 

    private final File historyFile = new File("history.log"); 

    /** 
    * The currently executed project (can be a reactor project). 
    * 
    * @parameter expression="${executedProject}" 
    * @readonly 
    */ 
    protected MavenProject executedProject; 

    public void execute() throws MojoExecutionException, MojoFailureException 
    { 
     createHistoryFile(); 
     try 
     { 
      copyHistoryFileToAllProjectSubdirectoriesOf(executedProject 
       .getBasedir()); 
     } 
     catch (IOException e) 
     { 
      throw new MojoExecutionException("Could not create history files", e); 
     } 
    } 

    private void createHistoryFile() 
    { 
     try 
     { 
      historyFile.createNewFile(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Copies {@link #historyFile} into all sub-directories of the provided directory which contain 
    * script.java file. 
    * 
    * @param pDirectory 
    * @throws IOException 
    */ 
    private void copyHistoryFileToAllProjectSubdirectoriesOf(File pDirectory) 
     throws IOException 
    { 
     copyMasterClasspathToFolder(pDirectory); 
     File[] directories = pDirectory 
      .listFiles((FileFilter) DirectoryFileFilter.DIRECTORY); 
     for (File subdirectory : directories) 
     { 
      copyMasterClasspathToFolder(subdirectory); 
     } 
    } 

    /** 
    * Copies {@link #historyFile} into the pDirectory if it contains a script.java file. 
    * 
    * @param pDirectory 
    * @throws IOException 
    */ 
    private void copyMasterClasspathToFolder(File pDirectory) 
     throws IOException 
    { 
     if (isScriptDirectory(pDirectory)) 
     { 
      FileUtils.copyFileToDirectory(historyFile, pDirectory); 
     } 
    } 

    /** 
    * The method verifies if in the folder there is ".project" and "script.java" files. 
    * 
    * @param pDirectory 
    * @return true if pDirectory points to an OATS script file. 
    */ 
    public static boolean isScriptDirectory(File pDirectory) 
    { 
     File projectFile = new File(pDirectory, ".project"); 
     File scriptFile = new File(pDirectory, "script.java"); 
     return scriptFile.exists() && projectFile.exists(); 
    } 

    public void setExecutedProject(MavenProject executedProject) 
    { 
     this.executedProject = executedProject; 
    } 

} 
+0

你可以顯示插件的來源.. – khmarbaise

回答

3

這個問題是從依賴衝突3.0.3版本maven-plugin-apimaven-eclipse-plugin版本2.9之間。更具體地說,maven-plugin-api爲版本3.0.3提取了Maven依賴項,而maven-eclipse-plugin則爲2.0.8版提取了Maven依賴項。

你其實並不需要maven-eclipse-plugin依賴,如果你刪除它,錯誤消失:

<dependencies> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-plugin-api</artifactId> 
     <version>3.0.3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-compat</artifactId> 
     <version>3.0.3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-exec</artifactId> 
     <version>1.1</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.maven.plugin-testing</groupId> 
     <artifactId>maven-plugin-testing-harness</artifactId> 
     <version>2.1</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

請注意,我還取消了對maven-core的顯式依賴:你不需要指定它,因爲它已經是maven-compat的傳遞依賴。