Skip to content

Commit e99a6ab

Browse files
authored
Support classifier in coordinates notation (#146)
Resolves #130
1 parent 6e6e6b6 commit e99a6ab

File tree

5 files changed

+101
-5
lines changed

5 files changed

+101
-5
lines changed

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ extraJavaModuleInfo {
7171
module("commons-beanutils:commons-beanutils", "org.apache.commons.beanutils") {
7272
exports("org.apache.commons.beanutils")
7373
// or granuarly allowing access to a package by specific modules
74-
// exports("org.apache.commons.beanutils", "org.mycompany.server", "org.mycompany.client")
74+
// exports("org.apache.commons.beanutils",
75+
// "org.mycompany.server", "org.mycompany.client")
76+
// or simply export all packages
7577
// exportAllPackages()
7678
7779
requiresTransitive("org.apache.commons.logging")
@@ -81,7 +83,8 @@ extraJavaModuleInfo {
8183
// closeModule()
8284
// opens("org.apache.commons.beanutils")
8385
// or granuarly allowing runtime-only access to a package by specific modules
84-
// opens("org.apache.commons.beanutils", "org.mycompany.server", "org.mycompany.client")
86+
// opens("org.apache.commons.beanutils",
87+
// "org.mycompany.server", "org.mycompany.client")
8588
8689
// requiresTransitive(...)
8790
// requiresStatic(...)
@@ -93,6 +96,12 @@ extraJavaModuleInfo {
9396
}
9497
module("commons-collections:commons-collections", "org.apache.commons.collections")
9598
automaticModule("commons-logging:commons-logging", "org.apache.commons.logging")
99+
100+
// when the Jar has a classifier - 'linux-x86_64' in this example:
101+
module("io.netty:netty-transport-native-epoll|linux-x86_64",
102+
"io.netty.transport.epoll.linux.x86_64")
103+
// when you somehow cannot address a Jar via coordinates, you may use the Jar name:
104+
module("commons-logging-1.2.jar", "org.apache.commons.loggin")
96105
}
97106
```
98107

src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoTransform.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import java.util.regex.Matcher;
6666
import java.util.regex.Pattern;
6767
import java.util.stream.Collectors;
68+
import java.util.stream.Stream;
6869
import java.util.zip.ZipEntry;
6970
import java.util.zip.ZipException;
7071

@@ -176,7 +177,19 @@ private ModuleSpec findModuleSpec(File originalJar) {
176177

177178
Optional<String> gaCoordinates = moduleSpecs.keySet().stream().filter(ga -> gaCoordinatesFromFilePathMatch(originalJar.toPath(), ga)).findFirst();
178179
if (gaCoordinates.isPresent()) {
179-
return moduleSpecs.get(gaCoordinates.get());
180+
String ga = gaCoordinates.get();
181+
if (moduleSpecs.containsKey(ga)) {
182+
return moduleSpecs.get(ga);
183+
} else {
184+
// maybe with classifier
185+
Stream<String> idsWithClassifier = moduleSpecs.keySet().stream().filter(id -> id.startsWith(ga + "|"));
186+
for (String idWithClassifier : idsWithClassifier.collect(Collectors.toList())) {
187+
if (nameHasClassifier(originalJar, moduleSpecs.get(idWithClassifier))) {
188+
return moduleSpecs.get(idWithClassifier);
189+
}
190+
}
191+
}
192+
return null;
180193
}
181194

182195
String originalJarName = originalJar.getName();
@@ -513,6 +526,10 @@ private String moduleNameFromSharedMapping(String ga) {
513526
return null;
514527
}
515528

529+
private boolean nameHasClassifier(File jar, ModuleSpec spec) {
530+
return jar.getName().endsWith("-" + spec.getClassifier() + ".jar");
531+
}
532+
516533
private static boolean isModuleInfoClass(String jarEntryName) {
517534
return "module-info.class".equals(jarEntryName) || MODULE_INFO_CLASS_MRJAR_PATH.matcher(jarEntryName).matches();
518535
}

src/main/java/org/gradlex/javamodule/moduleinfo/IdValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.gradlex.javamodule.moduleinfo;
1818

1919
class IdValidator {
20-
static private final String COORDINATES_PATTERN = "^[a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+$";
20+
static private final String COORDINATES_PATTERN = "^[a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+(\\|[a-zA-Z0-9._-]+)?$";
2121
static private final String FILE_NAME_PATTERN = "^[a-zA-Z0-9._-]+\\.(jar|zip)$";
2222

2323
static void validateIdentifier(String identifier) {

src/main/java/org/gradlex/javamodule/moduleinfo/ModuleSpec.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
public abstract class ModuleSpec implements Serializable {
3434

3535
private final String identifier;
36+
private final String classifier; // optional
3637
private final String moduleName;
3738
private final List<String> mergedJars = new ArrayList<>();
3839

@@ -41,7 +42,13 @@ public abstract class ModuleSpec implements Serializable {
4142
protected ModuleSpec(String identifier, String moduleName) {
4243
validateIdentifier(identifier);
4344
validateModuleName(moduleName);
44-
this.identifier = identifier;
45+
if (identifier.contains("|")) {
46+
this.identifier = identifier.split("\\|")[0];
47+
this.classifier = identifier.split("\\|")[1];
48+
} else {
49+
this.identifier = identifier;
50+
this.classifier = null;
51+
}
4552
this.moduleName = moduleName;
4653
}
4754

@@ -52,6 +59,13 @@ public String getIdentifier() {
5259
return identifier;
5360
}
5461

62+
/**
63+
* @return classifier, as an addition to group:name coordinates, if defined
64+
*/
65+
public String getClassifier() {
66+
return classifier;
67+
}
68+
5569
/**
5670
* @return Module Name of the Module to construct
5771
*/
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.gradlex.javamodule.moduleinfo.test
2+
3+
import org.gradle.testkit.runner.TaskOutcome
4+
import org.gradlex.javamodule.moduleinfo.test.fixture.GradleBuild
5+
import spock.lang.Specification
6+
7+
class ClassifiedJarsFunctionalTest extends Specification {
8+
9+
@Delegate
10+
GradleBuild build = new GradleBuild()
11+
12+
def setup() {
13+
settingsFile << 'rootProject.name = "test-project"'
14+
buildFile << '''
15+
plugins {
16+
id("application")
17+
id("org.gradlex.extra-java-module-info")
18+
}
19+
application {
20+
mainModule.set("org.gradle.sample.app")
21+
mainClass.set("org.gradle.sample.app.Main")
22+
}
23+
'''
24+
}
25+
26+
def "can address classified Jars via coordinates"() {
27+
given:
28+
file("src/main/java/org/gradle/sample/app/Main.java") << """
29+
package org.gradle.sample.app;
30+
public class Main {
31+
public static void main(String[] args) { }
32+
}
33+
"""
34+
file("src/main/java/module-info.java") << """
35+
module org.gradle.sample.app {
36+
requires io.netty.transport.epoll.linux.x86_64;
37+
requires io.netty.transport.epoll.linux.aarch_64;
38+
}
39+
"""
40+
buildFile << """
41+
dependencies {
42+
implementation(platform("io.netty:netty-bom:4.1.110.Final"))
43+
implementation("io.netty:netty-transport-native-epoll:0:linux-x86_64")
44+
implementation("io.netty:netty-transport-native-epoll:0:linux-aarch_64")
45+
}
46+
extraJavaModuleInfo {
47+
module("io.netty:netty-transport-native-epoll|linux-x86_64", "io.netty.transport.epoll.linux.x86_64")
48+
module("io.netty:netty-transport-native-epoll|linux-aarch_64", "io.netty.transport.epoll.linux.aarch_64")
49+
}
50+
"""
51+
52+
expect:
53+
build().task(':compileJava').outcome == TaskOutcome.SUCCESS
54+
}
55+
56+
}

0 commit comments

Comments
 (0)