Browse Source

Package META-INF/services/ files beneath BOOT-INF/classes/

Closes gh-30413
pull/30878/head
Andy Wilkinson 4 years ago
parent
commit
193ef9a06d
  1. 3
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootJar.java
  2. 21
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarTests.java
  3. 5
      spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Packager.java
  4. 14
      spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/AbstractPackagerTests.java

3
spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootJar.java

@ -110,7 +110,8 @@ public class BootJar extends Jar implements BootArchive { @@ -110,7 +110,8 @@ public class BootJar extends Jar implements BootArchive {
private void moveMetaInfToRoot(CopySpec spec) {
spec.eachFile((file) -> {
String path = file.getRelativeSourcePath().getPathString();
if (path.startsWith("META-INF/") && !path.equals("META-INF/aop.xml") && !path.endsWith(".kotlin_module")) {
if (path.startsWith("META-INF/") && !path.equals("META-INF/aop.xml") && !path.endsWith(".kotlin_module")
&& !path.startsWith("META-INF/services/")) {
this.support.moveToRoot(file);
}
});

21
spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootJarTests.java

@ -163,6 +163,27 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> { @@ -163,6 +163,27 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> {
}
}
@Test
void metaInfServicesEntryIsPackagedBeneathClassesDirectory() throws IOException {
getTask().getMainClass().set("com.example.Main");
File classpathDirectory = new File(this.temp, "classes");
File service = new File(classpathDirectory, "META-INF/services/com.example.Service");
service.getParentFile().mkdirs();
service.createNewFile();
File applicationClass = new File(classpathDirectory, "com/example/Application.class");
applicationClass.getParentFile().mkdirs();
applicationClass.createNewFile();
getTask().classpath(classpathDirectory);
executeTask();
try (JarFile jarFile = new JarFile(getTask().getArchiveFile().get().getAsFile())) {
assertThat(jarFile.getEntry("BOOT-INF/classes/com/example/Application.class")).isNotNull();
assertThat(jarFile.getEntry("com/example/Application.class")).isNull();
assertThat(jarFile.getEntry("BOOT-INF/classes/META-INF/services/com.example.Service")).isNotNull();
assertThat(jarFile.getEntry("META-INF/services/com.example.Service")).isNull();
}
}
private File createPopulatedJar() throws IOException {
addContent();
executeTask();

5
spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Packager.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -446,7 +446,8 @@ public abstract class Packager { @@ -446,7 +446,8 @@ public abstract class Packager {
private boolean isTransformable(JarArchiveEntry entry) {
String name = entry.getName();
if (name.startsWith("META-INF/")) {
return name.equals("META-INF/aop.xml") || name.endsWith(".kotlin_module");
return name.equals("META-INF/aop.xml") || name.endsWith(".kotlin_module")
|| name.startsWith("META-INF/services/");
}
return !name.startsWith("BOOT-INF/") && !name.equals("module-info.class");
}

14
spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/AbstractPackagerTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -484,6 +484,18 @@ abstract class AbstractPackagerTests<P extends Packager> { @@ -484,6 +484,18 @@ abstract class AbstractPackagerTests<P extends Packager> {
assertThat(getPackagedEntry("BOOT-INF/classes/META-INF/aop.xml")).isNotNull();
}
@Test
void metaInfServicesFilesAreMovedBeneathBootInfClassesWhenRepackaged() throws Exception {
this.testJarFile.addClass("A.class", ClassWithMainMethod.class);
File service = new File(this.tempDir, "com.example.Service");
service.createNewFile();
this.testJarFile.addFile("META-INF/services/com.example.Service", service);
P packager = createPackager();
execute(packager, NO_LIBRARIES);
assertThat(getPackagedEntry("META-INF/services/com.example.Service")).isNull();
assertThat(getPackagedEntry("BOOT-INF/classes/META-INF/services/com.example.Service")).isNotNull();
}
@Test
void allEntriesUseUnixPlatformAndUtf8NameEncoding() throws IOException {
this.testJarFile.addClass("A.class", ClassWithMainMethod.class);

Loading…
Cancel
Save