有没有办法在本地

时间:2016-12-02 08:35:50

标签: maven intellij-idea maven-3 maven-plugin maven-surefire-plugin

听起来很愚蠢。但有没有办法编辑或更新maven的默认绑定文件?

  

/META-INF/plexus/default-bindings.xml

我为什么要这样做?

背景 -

  • 我在我的机器上使用最新的maven version 3.3.9作为intelliJ中的主目录。

  • 我有一个名为testng-test的模块,没有指定任何外部插件。看一下模块的pom.xml

    <artifactId>testng</artifactId>
    
    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.13.6</version>
        </dependency>
    </dependencies>
    
  • 另一个名为junit-test的模块具有类似的pom.xml但具有不同的依赖关系,如下所示:

    <artifactId>junit</artifactId>
    
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    
  • 我在这些模块中添加了两个空类(还没有@Test方法或类)。

活动 -

  • 现在,当我尝试使用mvn clean install构建每个模块时,模块junit-test已成功构建,但模块testng-test失败并显示以下日志:
  

[INFO] --- maven-resources-plugin:2.6:资源(默认资源)@ testng ---

     

[INFO] --- maven-compiler-plugin:3.1:compile(default-compile)@ testng ---

     

[INFO] --- maven-resources-plugin:2.6:testResources(default-testResources)@ testng ---

     

[INFO] --- maven-compiler-plugin:3.1:testCompile(default-testCompile)@ testng ---

     

[INFO] --- maven-surefire-plugin:2.12.4 :test(default-test)@ testng ---

然后会遇到SurefireReflectionException -

  

运行TestNG6   org.apache.maven.surefire.util.SurefireReflectionException:   java.lang.reflect.InvocationTargetException;嵌套异常是   java.lang.reflect.InvocationTargetException:null   java.lang.reflect.InvocationTargetException           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           在java.lang.reflect.Method.invoke(Method.java:497)           at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)           在org.apache.maven.surefire.booter.ProviderFactory $ ProviderProxy.invoke(ProviderFactory.java:165)           在org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)           在org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)           在org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)   引起:org.apache.maven.surefire.testset.TestSetFailedException:   未知的TestNG版本6.9.13.6

尝试 -

根据我的注意,如果我在maven-surefire-plugin属性中明确更新2.19.1<plugins>的插件版本,那么事情就可以了。

但是,如果我不想显式覆盖项目的插件版本,在这种情况下如何使用我的项目的最新绑定(至少那些会修复)呢?

查看默认绑定,我可以在source code中看到 绑定在maven的default-bindings.xml文件中,但我无法在已安装的maven文件夹中找到它,以便可以编辑和更新。

那么有没有一种方法可以选择默认绑定来获取(默认情况下)我希望为项目列表中的任何maven模块指定要执行的插件版本?

2 个答案:

答案 0 :(得分:2)

该文件在jar中:

${MAVEN}/lib/maven-core-3.3.9.jar

所以:

${MAVEN}/lib/maven-core-3.3.9/META-INF/plexus/default-bindings.xml

答案 1 :(得分:1)

看起来你想要覆盖版本覆盖 maven-surefire-plugin 版本而不修改任何项目&#39;特定的pom.xml文件。为此,您需要扩展maven的本地安装。 Maven有super pom的概念,而pom(没有父)则隐含地扩展了它。

由于你既没有父pom也不想修改所有项目的pom,只剩下左边的选项似乎会覆盖默认的超级pom。我不确定覆盖绑定是否也有帮助。但是你应该能够通过以下步骤覆盖超级pom来满足你的需求。

1)通过复制default pom file(maven 3.x版本的目录内容)创建一个超级pom文件(pom-4.0.0.xml):

new ServerTask(MainActivity.this).execute();

2)为maven-surefire-plugin添加所需版本的条目,如下图所示。

\---org
    \---apache
        \---maven
            \---model
                    pom-4.0.0.xml 

3)创建一个jar,说 ... <pluginManagement> ... <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.19</version> </plugin> </plugins> </pluginManagement> ... 打包你的pom文件。

mycompany.superpom.jar

4)将jar放在$ MAVEN_HOME \ lib \ ext目录下。

5)你应该完成。您的所有项目都将使用指定版本的maven-surefire-plugin。

希望这有帮助。