Skip to content

Commit 2eabb95

Browse files
committed
Allow preserveExisting existing to be combined with other features
- removePackage: remove exports of package from existing module-info - ignoreServiceProvider: remove ignored providers from module-info
1 parent 5a072ab commit 2eabb95

3 files changed

Lines changed: 88 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Extra Java Module Info Gradle Plugin - Changelog
22

3+
## Version 1.13.2
4+
* [Fixed] [#219](https://github.com/gradlex-org/extra-java-module-info/issues/219) - Combine 'preserveExisting' and 'removePackage'
5+
* [Fixed] [#223](https://github.com/gradlex-org/extra-java-module-info/issues/223) - Combine 'preserveExisting' and 'ignoreServiceProvider'
6+
37
## Version 1.13.1
48
* [Fixed] [#197](https://github.com/gradlex-org/extra-java-module-info/issues/197) - Slightly adjust Gradle API usage for better 9.0.0 compatibility
59

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

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package org.gradlex.javamodule.moduleinfo;
33

4+
import static java.util.Collections.emptySet;
45
import static org.gradlex.javamodule.moduleinfo.FilePathToModuleCoordinates.gaCoordinatesFromFilePathMatch;
56
import static org.gradlex.javamodule.moduleinfo.FilePathToModuleCoordinates.versionFromFilePath;
67
import static org.gradlex.javamodule.moduleinfo.ModuleNameUtil.automaticModulNameFromFileName;
@@ -17,6 +18,7 @@
1718
import java.nio.charset.StandardCharsets;
1819
import java.nio.file.Files;
1920
import java.util.ArrayList;
21+
import java.util.Arrays;
2022
import java.util.Calendar;
2123
import java.util.Collection;
2224
import java.util.Collections;
@@ -337,13 +339,17 @@ private void addModuleDescriptor(File originalJar, File moduleJar, ModuleInfo mo
337339
moduleInfo,
338340
providers,
339341
versionFromFilePath(originalJar.toPath()),
340-
moduleInfo.exportAllPackages ? packages : Collections.emptySet(),
342+
moduleInfo.exportAllPackages ? packages : emptySet(),
343+
moduleInfo.getRemovedPackages(),
344+
moduleInfo.ignoreServiceProviders,
341345
existingModuleInfo));
342346
outputStream.closeEntry();
343347
}
344348
} catch (IOException e) {
345349
throw new RuntimeException(e);
346350
}
351+
352+
System.out.println(moduleJar);
347353
}
348354

349355
private JarOutputStream newJarOutputStream(OutputStream out, @Nullable Manifest manifest) throws IOException {
@@ -428,6 +434,8 @@ private byte[] addModuleInfo(
428434
Map<String, List<String>> providers,
429435
@Nullable String version,
430436
Set<String> autoExportedPackages,
437+
List<String> removedPackages,
438+
Map<String, Set<String>> ignoreServiceProviders,
431439
@Nullable byte[] existingModuleInfo) {
432440
ClassReader classReader =
433441
moduleInfo.preserveExisting && existingModuleInfo != null ? new ClassReader(existingModuleInfo) : null;
@@ -449,6 +457,42 @@ private byte[] addModuleInfo(
449457
public ModuleVisitor visitModule(String name, int access, String version) {
450458
ModuleVisitor moduleVisitor = super.visitModule(name, access, version);
451459
return new ModuleVisitor(Opcodes.ASM9, moduleVisitor) {
460+
461+
@Override
462+
public void visitPackage(String packaze) {
463+
if (!removedPackages.contains(pathToPackage(packaze))) {
464+
super.visitPackage(packaze);
465+
}
466+
}
467+
468+
@Override
469+
public void visitExport(String packaze, int access, String... modules) {
470+
if (!removedPackages.contains(pathToPackage(packaze))) {
471+
super.visitExport(packaze, access, modules);
472+
}
473+
}
474+
475+
@Override
476+
public void visitUse(String service) {
477+
String packaze = service.substring(0, service.lastIndexOf("/"));
478+
// if package is removed, also remove 'use' directives based on the package
479+
if (!removedPackages.contains(pathToPackage(packaze))) {
480+
super.visitUse(service);
481+
}
482+
}
483+
484+
@Override
485+
public void visitProvide(String service, String... providers) {
486+
String[] filteredProviders = Arrays.stream(providers)
487+
.filter(p -> ignoreServiceProviders
488+
.getOrDefault(service, emptySet())
489+
.contains(p))
490+
.toArray(String[]::new);
491+
if (filteredProviders.length > 0) {
492+
super.visitProvide(service, filteredProviders);
493+
}
494+
}
495+
452496
@Override
453497
public void visitEnd() {
454498
addModuleInfoEntires(moduleInfo, Collections.emptyMap(), autoExportedPackages, this);

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

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

33
import org.gradlex.javamodule.moduleinfo.test.fixture.GradleBuild
4-
import org.gradlex.javamodule.moduleinfo.test.fixture.LegacyLibraries
54
import spock.lang.Specification
65

76
class RemovePackageFunctionalTest extends Specification {
87

98
@Delegate
109
GradleBuild build = new GradleBuild()
1110

12-
LegacyLibraries libs = new LegacyLibraries(false)
13-
1411
def setup() {
1512
settingsFile << 'rootProject.name = "test-project"'
1613
buildFile << '''
@@ -23,6 +20,10 @@ class RemovePackageFunctionalTest extends Specification {
2320
mainClass.set("org.example.app.Main")
2421
}
2522
'''
23+
}
24+
25+
def "can remove duplicated packages"() {
26+
given:
2627
file("src/main/java/module-info.java") << """
2728
module org.example.app {
2829
requires jdk.xml.dom;
@@ -37,10 +38,7 @@ class RemovePackageFunctionalTest extends Specification {
3738
}
3839
}
3940
"""
40-
}
4141

42-
def "can remove duplicated packages"() {
43-
given:
4442
buildFile << """
4543
dependencies {
4644
implementation("xerces:xercesImpl:2.12.2") { isTransitive = false }
@@ -58,4 +56,39 @@ class RemovePackageFunctionalTest extends Specification {
5856
run()
5957
}
6058

59+
def "removes package from module-info if removePackage and preserveExisting are used together"() {
60+
given:
61+
file("src/main/java/module-info.java") << """
62+
module org.example.app {
63+
requires jakarta.el;
64+
requires org.apache.tomcat.embed.el;
65+
}
66+
"""
67+
file("src/main/java/org/gradle/sample/app/Main.java") << """
68+
package org.example.app;
69+
public class Main {
70+
public static void main(String[] args) {
71+
jakarta.el.ELContext context; // from original jakarta.el-api module
72+
org.apache.el.ValueExpressionLiteral exp; // from apache embedded module
73+
}
74+
}
75+
"""
76+
77+
buildFile << """
78+
dependencies {
79+
implementation("jakarta.el:jakarta.el-api:6.0.1")
80+
implementation("org.apache.tomcat.embed:tomcat-embed-el:11.0.18")
81+
}
82+
extraJavaModuleInfo {
83+
module("org.apache.tomcat.embed:tomcat-embed-el", "org.apache.tomcat.embed.el") {
84+
preserveExisting()
85+
removePackage("jakarta.el")
86+
}
87+
}
88+
"""
89+
90+
expect:
91+
run()
92+
}
93+
6194
}

0 commit comments

Comments
 (0)