Skip to content

Commit 983c21d

Browse files
committed
Jar merge: do not remove folders in 'META-INF/services'
Follow up to #45
1 parent 36106ca commit 983c21d

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,16 +243,15 @@ private void copyAndExtractProviders(JarInputStream inputStream, JarOutputStream
243243
while (jarEntry != null) {
244244
byte[] content = readAllBytes(inputStream);
245245
String entryName = jarEntry.getName();
246-
boolean isFileInServicesFolder = entryName.startsWith(SERVICES_PREFIX) && !entryName.equals(SERVICES_PREFIX);
246+
boolean isFileInServicesFolder = entryName.startsWith(SERVICES_PREFIX)
247+
&& !entryName.equals(SERVICES_PREFIX)
248+
&& !entryName.substring(SERVICES_PREFIX.length()).contains("/"); // ignore files in sub-folders
247249
if (isFileInServicesFolder) {
248250
String key = entryName.substring(SERVICES_PREFIX.length());
249-
boolean isServiceProviderFile = !key.contains("/"); // ignore files in sub-folders
250-
if (isServiceProviderFile) {
251-
if (!providers.containsKey(key)) {
252-
providers.put(key, new ArrayList<>());
253-
}
254-
providers.get(key).addAll(extractImplementations(content));
251+
if (!providers.containsKey(key)) {
252+
providers.put(key, new ArrayList<>());
255253
}
254+
providers.get(key).addAll(extractImplementations(content));
256255
}
257256

258257
if (!JAR_SIGNATURE_PATH.matcher(entryName).matches() && !"META-INF/MANIFEST.MF".equals(jarEntry.getName())) {

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

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,14 @@ abstract class AbstractFunctionalTest extends Specification {
331331
given:
332332
file("src/main/java/org/gradle/sample/app/Main.java") << """
333333
package org.gradle.sample.app;
334+
335+
import org.apache.qpid.jms.JmsConnection;
334336
335337
public class Main {
336-
public static void main(String[] args) { }
338+
public static void main(String[] args) {
339+
// Make sure files in '/META-INF/services/' that are not service provider entries are preserved
340+
JmsConnection.class.getResource("/META-INF/services/org/apache/qpid/jms/provider/amqp").toString();
341+
}
337342
}
338343
"""
339344
file("src/main/java/module-info.java") << """
@@ -347,8 +352,47 @@ abstract class AbstractFunctionalTest extends Specification {
347352
}
348353
349354
extraJavaModuleInfo {
350-
failOnMissingModuleInfo.set(false)
351-
module(${libs.qpidJmsClient}, "qpid.jms.client")
355+
module(${libs.qpidJmsClient}, "qpid.jms.client") {
356+
exports("org.apache.qpid.jms")
357+
requires("jakarta.messaging")
358+
}
359+
}
360+
"""
361+
362+
expect:
363+
run().task(':run').outcome == TaskOutcome.SUCCESS
364+
}
365+
366+
def "only takes well-defined services from META-INF/services (merge Jar)"() {
367+
given:
368+
file("src/main/java/org/gradle/sample/app/Main.java") << """
369+
package org.gradle.sample.app;
370+
371+
import org.apache.qpid.jms.JmsConnection;
372+
373+
public class Main {
374+
public static void main(String[] args) {
375+
// Make sure files in '/META-INF/services/' that are not service provider entries are preserved
376+
JmsConnection.class.getResource("/META-INF/services/org/apache/qpid/jms/provider/amqp").toString();
377+
}
378+
}
379+
"""
380+
file("src/main/java/module-info.java") << """
381+
module org.gradle.sample.app {
382+
requires qpid.jms.discovery;
383+
}
384+
"""
385+
buildFile << """
386+
dependencies {
387+
implementation("org.apache.qpid:qpid-jms-discovery:2.2.0")
388+
}
389+
390+
extraJavaModuleInfo {
391+
module(${libs.qpidJmsDiscovery}, "qpid.jms.discovery") {
392+
exports("org.apache.qpid.jms")
393+
requires("jakarta.messaging")
394+
mergeJar("org.apache.qpid:qpid-jms-client")
395+
}
352396
}
353397
"""
354398

src/test/groovy/org/gradlex/javamodule/moduleinfo/test/fixture/LegacyLibraries.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class LegacyLibraries {
2121
def jsr305 = jarNameOnly ? '"jsr305-3.0.2.jar"' : aliases ? 'libs.jsr305' : '"com.google.code.findbugs:jsr305"'
2222
def log4jCore = jarNameOnly ? '"log4j-core-2.14.0.jar"' : aliases ? 'libs.log4j.core' : '"org.apache.logging.log4j:log4j-core"'
2323
def qpidJmsClient = jarNameOnly ? '"qpid-jms-client-2.2.0.jar"' : aliases ? 'libs.qpid.jms.client' : '"org.apache.qpid:qpid-jms-client"'
24+
def qpidJmsDiscovery = jarNameOnly ? '"qpid-jms-discovery-2.2.0.jar"' : aliases ? 'libs.qpid.jms.discovery' : '"org.apache.qpid:qpid-jms-discovery"'
2425
def sac = jarNameOnly ? '"sac-1.3.jar"' : aliases ? 'libs.sac' : '"org.w3c.css:sac"'
2526
def slf4jApi = jarNameOnly ? '"slf4j-api-1.7.32.jar"' : aliases ? 'libs.slf4j.api' : '"org.slf4j:slf4j-api"'
2627
def slf4jExt = jarNameOnly ? '"slf4j-ext-1.7.32.jar"' : aliases ? 'libs.slf4j.ext' : '"org.slf4j:slf4j-ext"'
@@ -45,6 +46,7 @@ class LegacyLibraries {
4546
${alias(aliases.jsr305)} = '${unquote(coordinates.jsr305)}:1'
4647
${alias(aliases.log4jCore)} = '${unquote(coordinates.log4jCore)}:1'
4748
${alias(aliases.qpidJmsClient)} = '${unquote(coordinates.qpidJmsClient)}:1'
49+
${alias(aliases.qpidJmsDiscovery)} = '${unquote(coordinates.qpidJmsDiscovery)}:1'
4850
${alias(aliases.sac)} = '${unquote(coordinates.sac)}:1'
4951
${alias(aliases.slf4jApi)} = '${unquote(coordinates.slf4jApi)}:1'
5052
${alias(aliases.slf4jExt)} = '${unquote(coordinates.slf4jExt)}:1'

0 commit comments

Comments
 (0)