You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Sergei Ivanov (JIRA)" <ji...@codehaus.org> on 2015/02/10 13:26:18 UTC

[jira] (MNG-5718) Change 'provides' from Object to Properties in toolchains.xml

    [ https://jira.codehaus.org/browse/MNG-5718?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=362968#comment-362968 ] 

Sergei Ivanov commented on MNG-5718:
------------------------------------

Hi Robert,

One of our developers updated to Maven 3.2.5 and he is no longer able to build one of our projects that uses my GitHub fork of protobuf plugin for maven. The toolchains plugin fails to instantiate the custom protobuf toolchain, because the factory obviously expects a different return type for the {{getProvides()}} method. Since the toolchain API is part of Maven core, the plugin has no control over its actual version and has to use whatever is provided by Maven.

Here's the log file fragment:

{noformat}
[INFO] --- maven-toolchains-plugin:1.1:toolchain (default) @ xxx-common-parent-pom ---
[INFO] Required toolchain: jdk [ version='1.7' ]
[INFO] Found matching toolchain for type jdk: JDK[C:\Users\sivanov\Applications\java\jdk1.7.0_60_x64]
[INFO] Required toolchain: protobuf [ version='[2.5,2.6)' ]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.330 s
[INFO] Finished at: 2015-02-10T11:59:58+00:00
[INFO] Final Memory: 19M/309M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-toolchains-plugin:1.1:toolchain (default) on project xxx-common-parent-pom: Incompatible toolchain API: InvocationTargetException: org.apache.maven.toolchain.model.ToolchainModel.getProvides()Ljava/lang/Object; -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-toolchains-plugin:1.1:toolchain (default) on project xxx-common-parent-pom: Incompatible toolchain API
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:160)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: Incompatible toolchain API
	at org.apache.maven.plugin.toolchain.ToolchainMojo.getToolchains(ToolchainMojo.java:225)
	at org.apache.maven.plugin.toolchain.ToolchainMojo.selectToolchain(ToolchainMojo.java:147)
	at org.apache.maven.plugin.toolchain.ToolchainMojo.execute(ToolchainMojo.java:90)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	... 19 more
Caused by: 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)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at org.apache.maven.plugin.toolchain.ToolchainMojo.getToolchains(ToolchainMojo.java:194)
	... 23 more
Caused by: java.lang.NoSuchMethodError: org.apache.maven.toolchain.model.ToolchainModel.getProvides()Ljava/lang/Object;
	at com.google.protobuf.maven.toolchain.DefaultProtobufToolchainFactory.createToolchain(DefaultProtobufToolchainFactory.java:52)
	at org.apache.maven.toolchain.DefaultToolchainManagerPrivate.getToolchainsForType(DefaultToolchainManagerPrivate.java:66)
	... 28 more
{noformat}

This was hardly a backwardly compatible change to introduce in a patch release. In fact, not backwardly compatible at all from the toolchain implementor's point of view. I understand that the API needs to change from time to time, and I realise that it's impossible to make this change in the MDO model without breaking compatibility, but I would expect at least a prominent compatibility warning in the release notes for Maven release. Sorry for sounding aggressive, but it has caused me a lot of frustration this morning.

On the bright side, after looking at the related commits and related issues, I've found that Hervé had updated the reference implementation in toolchain ITs to work around this issue. Let me post a link here for posterity:
http://svn.apache.org/viewvc/maven/plugins/tags/maven-toolchains-plugin-1.1/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainFactory.java?view=markup
The important bit is {{getProvidesProperties()}} method that uses reflection underneath to work around API incompatibilities.

> Change 'provides' from Object to Properties in toolchains.xml
> -------------------------------------------------------------
>
>                 Key: MNG-5718
>                 URL: https://jira.codehaus.org/browse/MNG-5718
>             Project: Maven
>          Issue Type: Improvement
>          Components: Toolchains
>            Reporter: Robert Scholte
>            Assignee: Robert Scholte
>             Fix For: 3.2.5
>
>
> Officially the content of the {{<provides>}} element in a toolchain was free of structure, although we only know Properties-like structures. To be able to support the merging of toolchains ( MNG-5714 ) it is better to drop the free structure and change it to Properties.
> The {{jdk}} toolchain will be modified accordingly, being transparent for users.
> But any custom toolchain implementation will need to be updated.



--
This message was sent by Atlassian JIRA
(v6.1.6#6162)