Skip to content

Commit 2f90e74

Browse files
authored
Take 'META-INF/versions' into account when calculating package names (#83)
Fixes #77
1 parent 4a6913d commit 2f90e74

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import java.util.jar.JarInputStream;
5959
import java.util.jar.JarOutputStream;
6060
import java.util.jar.Manifest;
61+
import java.util.regex.Matcher;
6162
import java.util.regex.Pattern;
6263
import java.util.stream.Collectors;
6364
import java.util.zip.ZipEntry;
@@ -76,6 +77,7 @@
7677
public abstract class ExtraJavaModuleInfoTransform implements TransformAction<ExtraJavaModuleInfoTransform.Parameter> {
7778

7879
private static final Pattern MODULE_INFO_CLASS_MRJAR_PATH = Pattern.compile("META-INF/versions/\\d+/module-info.class");
80+
private static final Pattern MRJAR_VERSIONS_PATH = Pattern.compile("META-INF/versions/\\d+/(.*)/.*");
7981
private static final Pattern JAR_SIGNATURE_PATH = Pattern.compile("^META-INF/[^/]+\\.(SF|RSA|DSA|sf|rsa|dsa)$");
8082
private static final String SERVICES_PREFIX = "META-INF/services/";
8183

@@ -280,7 +282,13 @@ private void copyAndExtractProviders(JarInputStream inputStream, JarOutputStream
280282
if (entryName.endsWith(".class")) {
281283
int i = entryName.lastIndexOf("/");
282284
if (i > 0) {
283-
packages.add(entryName.substring(0, i));
285+
Matcher mrJarMatcher = MRJAR_VERSIONS_PATH.matcher(entryName);
286+
if (mrJarMatcher.matches()) {
287+
// Strip the 'META-INF/versions/11' part
288+
packages.add(mrJarMatcher.group(1));
289+
} else {
290+
packages.add(entryName.substring(0, i));
291+
}
284292
}
285293
}
286294
}

src/test/groovy/org/gradlex/javamodule/moduleinfo/test/EdgeCasesFunctionalTest.groovy

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.gradlex.javamodule.moduleinfo.test
22

3+
import org.gradle.testkit.runner.TaskOutcome
34
import org.gradlex.javamodule.moduleinfo.test.fixture.GradleBuild
45
import org.gradlex.javamodule.moduleinfo.test.fixture.LegacyLibraries
56
import spock.lang.Specification
@@ -139,4 +140,41 @@ class EdgeCasesFunctionalTest extends Specification {
139140
then:
140141
result.output.contains('[jsr305-3.0.2-module.jar]')
141142
}
143+
144+
def "can automatically export all packages of a multi-release legacy Jar"() {
145+
given:
146+
file("src/main/java/org/gradle/sample/app/Main.java") << """
147+
package org.gradle.sample.app;
148+
149+
import org.kohsuke.github.GHApp;
150+
151+
public class Main {
152+
public static void main(String[] args) {
153+
GHApp app = new GHApp();
154+
}
155+
}
156+
"""
157+
file("src/main/java/module-info.java") << """
158+
module org.gradle.sample.app {
159+
exports org.gradle.sample.app;
160+
161+
requires org.kohsuke.github;
162+
}
163+
"""
164+
buildFile << """
165+
dependencies {
166+
implementation("org.kohsuke:github-api:1.317")
167+
}
168+
169+
extraJavaModuleInfo {
170+
module("org.kohsuke:github-api", "org.kohsuke.github") {
171+
exportAllPackages()
172+
requires("org.apache.commons.lang3")
173+
}
174+
}
175+
"""
176+
177+
expect:
178+
run().task(':run').outcome == TaskOutcome.SUCCESS
179+
}
142180
}

0 commit comments

Comments
 (0)