diff --git a/CHANGELOG.md b/CHANGELOG.md
index 67991a68..f36e1d7f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@
* [Adjusted Rule] [#174](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/174) jakarta.xml.ws-api and jakarta.xml.ws-api merger is now considered (Thanks [KO](https://github.com/ko-at-work) for reporting)
* [Adjusted Rule] [#201](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/201) Add woodstox:wstx-lgpl to WOODSTOX
* [Adjusted Rule] [#202](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/202) Remove org.apache.tomcat:tomcat-websocket from JAVAX_WEBSOCKET_API
+* [New] [#229](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/229) Patching: addTargetPlatformVariant optionally accepts a feature name
* [Fix] [#196](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/196) No longer call eager methods on configurations container (Thanks [Ian Brandt](https://github.com/ianbrandt) for reporting)
## Version 2.2
diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java
index eeab2df3..5d0d6b82 100644
--- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java
+++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java
@@ -145,7 +145,17 @@ public void addFeature(String classifier) {
* See: component_metadata_rules.html#adding_variants_for_native_jars
*/
public void addTargetPlatformVariant(String classifier, String operatingSystem, String architecture) {
- getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params(classifier, operatingSystem, architecture));
+ getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params("", classifier, operatingSystem, architecture));
+ }
+
+ /**
+ * Make the Jar with the give 'classifier' known as additional variant with the
+ * OperatingSystemFamily and MachineArchitecture attributes set.
+ * A 'feature' (aka Capability) can optionally be defined to require the variant to be addressed by it.
+ * See: component_metadata_rules.html#adding_variants_for_native_jars
+ */
+ public void addTargetPlatformVariant(String feature, String classifier, String operatingSystem, String architecture) {
+ getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params(feature, classifier, operatingSystem, architecture));
}
/**
diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java
index 5e5ff4d5..06b15eee 100644
--- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java
+++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java
@@ -38,6 +38,7 @@
@CacheableRule
public abstract class AddTargetPlatformVariantsMetadataRule implements ComponentMetadataRule {
+ private final String feature;
private final String classifier;
private final String operatingSystem;
private final String architecture;
@@ -46,7 +47,8 @@ public abstract class AddTargetPlatformVariantsMetadataRule implements Component
abstract protected ObjectFactory getObjects();
@Inject
- public AddTargetPlatformVariantsMetadataRule(String classifier, String operatingSystem, String architecture) {
+ public AddTargetPlatformVariantsMetadataRule(String feature, String classifier, String operatingSystem, String architecture) {
+ this.feature = feature;
this.classifier = classifier;
this.operatingSystem = operatingSystem;
this.architecture = architecture;
@@ -56,6 +58,9 @@ public AddTargetPlatformVariantsMetadataRule(String classifier, String operating
public void execute(ComponentMetadataContext context) {
ComponentMetadataDetails details = context.getDetails();
if (classifier.isEmpty()) {
+ if (!feature.isEmpty()) {
+ throw new IllegalStateException("if classifier is empty, feature must be empty too.");
+ }
details.withVariant("compile", this::configureAttributes);
details.withVariant("runtime", this::configureAttributes);
} else {
@@ -65,10 +70,17 @@ public void execute(ComponentMetadataContext context) {
}
private void addTargetPlatformVariant(ComponentMetadataDetails details, String nameSuffix, String baseVariant) {
+ String group = details.getId().getGroup();
String name = details.getId().getName();
String version = details.getId().getVersion();
details.addVariant(classifier + nameSuffix, baseVariant, variant -> {
+ if (!feature.isEmpty()) {
+ variant.withCapabilities(c -> {
+ c.removeCapability(group, name);
+ c.addCapability(group, name + "-" + feature, version);
+ });
+ }
configureAttributes(variant);
variant.withFiles(files -> {
files.removeAllFiles();
diff --git a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/patch/AddTargetPlatformVariantTest.groovy b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/patch/AddTargetPlatformVariantTest.groovy
index 9f198d77..15dda7fb 100644
--- a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/patch/AddTargetPlatformVariantTest.groovy
+++ b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/patch/AddTargetPlatformVariantTest.groovy
@@ -1,6 +1,7 @@
package org.gradlex.jvm.dependency.conflict.test.patch
class AddTargetPlatformVariantTest extends AbstractPatchTest {
+
def "can add target variant"() {
given:
buildFile << """
@@ -22,11 +23,47 @@ class AddTargetPlatformVariantTest extends AbstractPatchTest {
dependencies {
implementation("org.openjfx:javafx-base:17.0.10")
}
+ tasks.register("printJars") {
+ println(configurations.compileClasspath.get().files.joinToString("\\n") { it.name });
+ }
+ """
+
+ expect:
+ String output = printJars().output
+ output == 'javafx-base-17.0.10-win.jar\n'
+ }
+
+ def "can add target variant with feature name"() {
+ given:
+ buildFile << """
+ jvmDependencyConflicts {
+ patch {
+ module("org.lwjgl:lwjgl") {
+ addTargetPlatformVariant("natives", "natives-linux", "linux", "x86-64")
+ addTargetPlatformVariant("natives", "natives-linux-arm64", "linux", "aarch64")
+ addTargetPlatformVariant("natives", "natives-macos", "macos", "x86-64")
+ addTargetPlatformVariant("natives", "natives-macos-arm64", "macos", "aarch64")
+ addTargetPlatformVariant("natives", "natives-windows", "windows", "x86-64")
+ addTargetPlatformVariant("natives", "natives-windows-arm64", "windows", "aarch64")
+ }
+ }
+ }
+ configurations.runtimeClasspath {
+ attributes.attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named("windows"))
+ attributes.attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named("x86-64"))
+ }
+ dependencies {
+ implementation("org.lwjgl:lwjgl:3.3.6")
+ runtimeOnly("org.lwjgl:lwjgl:3.3.6") { capabilities { requireCapability("org.lwjgl:lwjgl-natives") } }
+ }
+ tasks.register("printJars") {
+ println(configurations.runtimeClasspath.get().files.joinToString("\\n") { it.name });
+ }
"""
expect:
- String output = dependencyInsight("org.openjfx:javafx-base").output
- output.contains 'windows'
- output.contains 'x86-64'
+ dependenciesCompile()
+ String output = printJars().output
+ output == 'lwjgl-3.3.6.jar\nlwjgl-3.3.6-natives-windows.jar\n'
}
}