How can I specify a dependency classifier dynamically?

I know that I can do this:

dependencies.b (group: 'org.hsqldb', name: 'hsqldb', version: 'fake-2', classifier: 'jdk5')

But I am reading my dependencies from a file (an “ivy.xml” file). If I could dynamically get “dependencies.b”, like with “dependencies[‘b’]”, I could presumably loop through my dependencies, but “b” must apparently be a hard-coded bare word and “dependencies[‘b’]” doesn’t work. I can handle all of the other attributes without trying to reverse engineer like this, because the Gradle API and Ivy API directly support all attributes other than classifier. I see no way in the API spec to pass either the classifier value or a hash like shown above to a dependency. I guess that in the code above, some method or constructor is being called with the given map, but I have no idea what method is being called for what class or instance.

‘dependencies.b (…)’ adds org.gradle.api.artifacts.Dependency instances to the ‘configurations.b.dependencies’ collection. It also returns the Dependency instance. You can use either of these to get at the dependencies programmatically to do what you need.

A classifier artifact is modelled as a org.gradle.api.artifacts.DependencyArtifact, added to the ‘artifacts’ collection of the Dependency instance (or more correctly, the org.gradle.api.artifacts.ExternalModuleDependency instance).

That all makes a lot of sense. As you suggest, I want to externalModuleDependency.addArtifact(x) my classifier DependencyArtifact. But I still have no idea how to instantiate a “classifier artifact… modelled as a DependencyArtifact”.

DependencyArtifact is an interface not a class, and the interface is immutable, so what is the factory instantiator or implementation class that I can use to instantiate a classifier DependencyArtifact?

Simply use ModuleDependency.artifact { }, the closure gets a DependencyArtifact instance, which you just need to configure.

RESOLVED Sincere thanks to Adam and Detelin.

For the benefit of posterity, here’s what I ended up doing. I instantiate my Dependency instances like this:

dependencies { dep = add(mappableConfName, depAttrs) }

where mappableConfName is a String and depAttrs is a String/String map which may have keys ‘group’, ‘name’, ‘version’, ‘classifier’. I use the dep reference afterwards to make other adjustments.