听起来很愚蠢。但有没有办法编辑或更新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模块指定要执行的插件版本?
答案 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。
希望这有帮助。