Gradle plugin and multi projects

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Gradle plugin and multi projects

Alex Silva

Hi all,

I am using the Gradle plugin for publishing artifacts to Artifactory. I also have a multi-project build with Gradle. All the subprojects apply the plugin in their build.gradle files.

I have seen a strange problem in this configuration. Whenever a subproject declares more than one classpath dependency as in the following example:

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }

  dependencies {
    classpath "com.google.protobuf:protobuf-gradle-plugin:0.7.0"
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
  }
}

apply plugin: "java"
apply plugin: "maven-publish"
apply plugin: "com.google.protobuf"
apply plugin: "com.jfrog.artifactory"

Then Gradle fails to configure the root project with the error:

Cannot cast object 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention@6dded900' with class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention' to class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention'

It succeeds to configure a single individual project, though. It also succeeds if I remove the Artifactory plugin classpath from these projects that declare more than one classpath, but I actually need this plugin in all subprojects.

Thanks,

--
Qnective

Alex Silva
Software Engineer

Thurgauerstrasse 54 | 8050 Zürich | Switzerland
http://www.qnective.com/ | [hidden email]

------------------------------------------------------------------------------

_______________________________________________
Artifactory-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/artifactory-users
Reply | Threaded
Open this post in threaded view
|

Re: Gradle plugin and multi projects

HughG_TMVSE

Hi Alex,

 

I don’t have a full solution for you, just a clue.  I had a similar confusing error using an in-house Gradle plugin with a multi-project build, under Gradle 1.4.  The underlying cause was that, if a plugin is applied in multiple subprojects but not in their parent project (usually the root project) Gradle seems to load the plugins for each project into a separate classloader.  That gives you class cast exceptions when the plugin instance on one project tries to use objects from the plugin on another project.  The “fix” was to apply the plugin in the root project as well, even though it wasn’t used there.

 

I think we also had a similar problem using plugin objects within the build script: we were declaring variables using the explicit type we expected, instead of just “def”; but the type in the script was from a different classloader than the object we were handling.  In that case, I think it was a sufficient workaround, to just change the declaration to use “def”.

 

If the above doesn’t help, I wonder if your problem is not that you have >1 buildscript dependency, but that you have that JFrog plugin at all.  Does the error still happen if you don’t have the protobuf plugin?  And if you have protobuf but not build-info-extractor?

 

In any case, it would be good to re-run with -s or -S to see where the class cast exception is happening.  If it’s inside the JFrog plugin, maybe it needs a code change.  Or maybe there’s some other way to write your multi-project build so you don’t effectively pass things between projects.

 

Hope that helps,

 

Hugh Greene, Senior Software Developer
Toshiba Medical Visualization Systems Europe, Ltd
Bonnington Bond, 2 Anderson Place, Edinburgh EH6 5NP, UK
Tel + 44 (0)131 472 4792 / Fax + 44 (0) 131 472 4799
http://www.tmvse.com / [hidden email]

 

DISCLAIMER
Unless indicated otherwise, the information contained in this message is privileged and confidential, and is intended only for the use of the addressee(s) named above and others who have been specifically authorized to receive it. If you are not the intended recipient, you are hereby notified that any dissemination, distribution or copying of this message and/or attachments is strictly prohibited. The company accepts no liability for any damage caused by any virus transmitted by this email. Furthermore, the company does not warrant a proper and complete transmission of this information, nor does it accept liability for any delays. If you have received this message in error, please contact the sender and delete the message.

 

From: Alex Silva [mailto:[hidden email]]
Sent: 15 October 2015 09:02
To: [hidden email]
Subject: [Artifactory-users] Gradle plugin and multi projects

 

Hi all,

I am using the Gradle plugin for publishing artifacts to Artifactory. I also have a multi-project build with Gradle. All the subprojects apply the plugin in their build.gradle files.

I have seen a strange problem in this configuration. Whenever a subproject declares more than one classpath dependency as in the following example:

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
 
  dependencies {
    classpath "com.google.protobuf:protobuf-gradle-plugin:0.7.0"
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
  }
}
 
apply plugin: "java"
apply plugin: "maven-publish"
apply plugin: "com.google.protobuf"
apply plugin: "com.jfrog.artifactory"

Then Gradle fails to configure the root project with the error:

Cannot cast object 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention@6dded900' with class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention' to class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention'

It succeeds to configure a single individual project, though. It also succeeds if I remove the Artifactory plugin classpath from these projects that declare more than one classpath, but I actually need this plugin in all subprojects.

Thanks,

--

Qnective

Alex Silva
Software Engineer

Thurgauerstrasse 54 | 8050 Zürich | Switzerland
http://www.qnective.com/ | [hidden email]


______________________________________________________________________
This email has been scanned by the Symantec Email Security.cloud service.
For more information please visit http://www.symanteccloud.com
______________________________________________________________________


______________________________________________________________________
This email has been scanned by the Symantec Email Security.cloud service.
For more information please visit http://www.symanteccloud.com
______________________________________________________________________

------------------------------------------------------------------------------

_______________________________________________
Artifactory-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/artifactory-users
Reply | Threaded
Open this post in threaded view
|

Re: Gradle plugin and multi projects

Alex Silva
Hello,

On 15 October 2015 at 10:52, Greene, Hugh [hidden email] wrote:

I don’t have a full solution for you, just a clue. I had a similar
confusing error using an in-house Gradle plugin with a multi-project
build, under Gradle 1.4. The underlying cause was that, if a plugin is
applied in multiple subprojects but not in their parent project
(usually the root project) Gradle seems to load the plugins for each
project into a separate classloader. That gives you class cast
exceptions when the plugin instance on one project tries to use
objects from the plugin on another project. The “fix” was to apply the
plugin in the root project as well, even though it wasn’t used there.

Thanks for your suggestion! I added this to the root project:

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }

  dependencies {
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
  }
}

And it seems to be working now. The funny thing is that I cannot
actually apply the Artifactory plugin to the root project or it fails
too, I can only declare the class path. To be honest it seems like a
bug in the plugin somewhere, given that the protobuf plugin has no
such shortcomings.

Cheers,

--
Qnective

Alex Silva
Software Engineer

Thurgauerstrasse 54 | 8050 Zürich | Switzerland
http://www.qnective.com/ | [hidden email]

------------------------------------------------------------------------------
_______________________________________________
Artifactory-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/artifactory-users