Разработка плагинов для Maven - как обеспечить сборку для Maven 3.0.x вместо 3.1.x?

Я пытаюсь разработать собственный плагин Maven. В настоящее время я сталкиваюсь с этой проблемой, когда я выполняю свои модульные тесты: java.lang.NoClassDefFoundError: org.eclipse.aether.RepositorySystemSession Трассировка стека ниже:

initializationError (com.mycompany.MyPluginTest) Прошедшее время: 0 секунд (TestSuite.java:132)
    в org.junit.internal.runners.JUnit38ClassRunner.(JUnit38ClassRunner.java:72)
    в org.junit.internal.builders.JUnit3Builder.runnerForClass(JUnit3Builder.java:11)
    в org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    в org.junit.internal.builders.AllDefaultPossabilitiesBuilder.runnerForClass(AllDefaultPossabilitiesBuilder.java:26)
    в org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    в org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
    в org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262)
    в org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    в org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
    в org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
    в org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
    в org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Вызывается: java.lang.ClassNotFoundException: org.eclipse.aether.RepositorySystemSession
    на java.net.URLClassLoader.findClass(URLClassLoader.java:423)
    в java.lang.ClassLoader.loadClass(ClassLoader.java:660)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:346)
    в java.lang.ClassLoader.loadClass(ClassLoader.java:626)
    at java.lang.J9VMInternals.verifyImpl(собственный метод)
    в java.lang.J9VMInternals.verify(J9VMInternals.java:72)
    в java.lang.J9VMInternals.verify(J9VMInternals.java:70)
    в java.lang.J9VMInternals.initialize(J9VMInternals.java:134)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:44)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    в java.lang.reflect.Constructor.newInstance(Constructor.java:516)
    в junit.framework.TestSuite.createTest(TestSuite.java:63)
    на junit.framework.TestSuite.addTestMethod(TestSuite.java:310)
    в junit.framework.TestSuite.addTestsFromTestCase(TestSuite.java:153)
    на junit.framework.TestSuite.(TestSuite.java:132)
    в org.junit.internal.runners.JUnit38ClassRunner.(JUnit38ClassRunner.java:72)
    в org.junit.internal.builders.JUnit3Builder.runnerForClass(JUnit3Builder.java:11)
    в org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    в org.junit.internal.builders.AllDefaultPossabilitiesBuilder.runnerForClass(AllDefaultPossabilitiesBuilder.java:26)
    в org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    в org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
    в org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:262)
    в org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    в org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
    в org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
    в org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
    в org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

По моим исследованиям, это может произойти при сборке для Maven 3.1.x, потому что Maven переключился с реализации эфира sonatype на реализацию eclipse.

Я пытаюсь создать свой плагин для Eclipse 3.0.4, так как это то, что установлено на всех наших рабочих станциях. Я предполагаю, что вижу эту ошибку, потому что одной из моих зависимостей является зависимость Maven 3.1.x, хотя я не уверен, какая именно. Кто-нибудь знает, какую зависимость я должен исправить?

Кроме того, кто-нибудь знает, возможно ли создать плагин, который будет работать для Maven 3.0.x и 3.1.x? Я бы предпочел не проходить через все это снова когда-нибудь в будущем, когда мы перейдем на более новую версию Maven.

Зависимости в моем POM выглядят так:

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.0.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-tools-api</artifactId>
        <version>3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-testing</groupId>
        <artifactId>maven-plugin-testing-harness</artifactId>
        <version>3.0.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-compat</artifactId>
        <version>3.0.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-model</artifactId>
        <version>3.0.4</version>
    </dependency>
</dependencies>

3 ответа

Решение

Итак, я думаю, что я выяснил проблему с эфиром: это зависит от того, какая версия maven-plugin-testing-harness используется. Версия <= 2.1, кажется, использует эфир эфирного типа. Использование этого набора зависимостей решает проблему эфира:

    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-artifact</artifactId>
        <version>3.0.5</version>
    </dependency>

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

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

    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
    </dependency> 

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

    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.1</version>
    </dependency>
    <dependency>
        <!-- version 2.1 uses sonatype aether. anything after 2.1 uses eclipse aether. -->
        <groupId>org.apache.maven.plugin-testing</groupId>
        <artifactId>maven-plugin-testing-harness</artifactId>
        <scope>test</scope>
        <version>2.1</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>

Чуть более запутанно, чем переход к зависимости эфира затмения, множество зависимостей maven-plugin-testing-harness изменился ли объем с compile в provided это означает, что они не разрешены вашей зависимостью.

Похоже, что на самом деле это произошло и в Fedora, и они подняли эту проблему с помощью Apache, на который не обращали внимания более года...

На них apache ошибка, они утверждают, что вам придется добавить зависимости на maven-core, maven-model, maven-aether-provider но, посмотрев на зависимости maven-plugin-testing-harness Есть и другие provided Зависимости области.

Зависимости, которые я должен был добавить, чтобы убедить всех работать с плагином тестирования 3.3, были:

<dependency>
    <groupId>org.apache.maven.plugin-testing</groupId>
    <artifactId>maven-plugin-testing-harness</artifactId>
    <version>3.3.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-compat</artifactId>
    <version>3.3.3</version>
</dependency>
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-core</artifactId>
    <version>3.3.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>maven</groupId>
    <artifactId>maven-model</artifactId>
    <version>3.0.2.javadoc</version>
    <type>javadoc.jar</type>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-aether-provider</artifactId>
    <version>3.3.3</version>
    <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-plugin-api</artifactId>
  <version>3.3.3</version>
</dependency>
<dependency>
  <groupId>org.apache.maven.plugin-tools</groupId>
  <artifactId>maven-plugin-annotations</artifactId>
  <version>3.2</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.codehaus.plexus</groupId>
  <artifactId>plexus-utils</artifactId>
  <version>3.0.15</version>
</dependency>

Так что, интересно и странно, ответы, представленные выше, не сработали для меня. Покопался и ничего не нашел. Наконец, прошел полный круг, когда посетил URL плагина: http://maven.apache.org/plugin-testing/maven-plugin-testing-harness/dependency-convergence.html

Раздел "Конвергенция зависимостей" содержит все версии зависимостей, необходимые для того, чтобы плагин "загорался". В считанные секунды все работало. Вот фрагмент того, что я в конце концов получил в моем помпе:

    <dependency>
        <groupId>org.apache.maven.plugin-testing</groupId>
        <artifactId>maven-plugin-testing-harness</artifactId>
        <version>3.3.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-compat</artifactId>
        <version>3.2.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.2.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-model</artifactId>
        <version>3.2.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-aether-provider</artifactId>
        <version>3.2.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.3</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <type>jar</type>
        <scope>test</scope>
    </dependency>

Надеюсь, это поможет кому-то там:)

Другие вопросы по тегам