【问题标题】:Maven plugin development - how to ensure building for Maven 3.0.x instead of 3.1.x?Maven 插件开发 - 如何确保为 Maven 3.0.x 而不是 3.1.x 构建?
【发布时间】:2014-04-14 03:23:51
【问题描述】:

我正在尝试开发一个自定义 Maven 插件。我目前在执行单元测试时遇到了这个问题:java.lang.NoClassDefFoundError: org.eclipse.aether.RepositorySystemSession 堆栈跟踪如下:

初始化错误(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.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.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) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:346) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:626) 在 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) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:44) 在 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.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.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 aether 实现切换到 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>

【问题讨论】:

  • 你能显示你的插件代码吗?可能是github项目?
  • 其他人觉得讽刺的是,维护依赖管理构建工具的测试夹具的人做错了依赖管理?

标签: maven maven-3 maven-mojo


【解决方案1】:

好的,所以我想我发现了以太的问题:它似乎取决于正在使用哪个版本的maven-plugin-testing-harness。版本

    <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>

【讨论】:

  • 基本上,如果您考虑提供的依赖项mvnrepository.com/artifact/org.apache.maven.plugin-testing/…,您就会拥有必须包含的依赖项列表。我在阅读您的答案并查看 mvncentral 时发现了这一点。恕我直言,应该只是添加一个依赖项,简单明了,使测试更容易。
【解决方案2】:

比转移到 eclipse aether 依赖更令人困惑的是,maven-plugin-testing-harness 的许多依赖的范围从 compile 更改为 provided,这意味着它们不会被您的下游依赖解析。

好像Fedora也有这种情况,他们提出了一年多没有关注的this issue with 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>

【讨论】:

  • 很高兴您链接了相关的错误。我希望这个问题的所有 2500 多名观众现在就去投票;)
【解决方案3】:

所以,很有趣也很奇怪,上面提供的答案对我不起作用。做了一些挖掘,没有发现任何东西。访问插件网址时终于绕了一圈:http://maven.apache.org/plugin-testing/maven-plugin-testing-harness/dependency-convergence.html

“依赖收敛”部分提供了确保插件“点亮”所需的所有依赖版本。在几秒钟内,一切都在工作。这是我最终在我的 pom 中拥有的内容的 sn-p:

    <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>

希望这对那里的人有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多