Merge branch '2.3.x' into 2.4.x
Closes gh-24710
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2012-2019 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.bootjar.classpath;
|
||||
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
|
||||
/**
|
||||
* Application used for testing classpath handling with BootJar.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class BootJarClasspathApplication {
|
||||
|
||||
protected BootJarClasspathApplication() {
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int i = 1;
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
for (URL url : ((URLClassLoader) classLoader).getURLs()) {
|
||||
System.out.println(i++ + ". " + url.getFile());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.main;
|
||||
package com.example.bootjar.main;
|
||||
|
||||
/**
|
||||
* Application used for testing {@code BootRun}'s main class configuration.
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.classpath;
|
||||
package com.example.bootrun.classpath;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.management.ManagementFactory;
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.jvmargs;
|
||||
package com.example.bootrun.jvmargs;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.bootrun.main;
|
||||
|
||||
/**
|
||||
* Application used for testing {@code BootRun}'s main class configuration.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class CustomMainClass {
|
||||
|
||||
protected CustomMainClass() {
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(CustomMainClass.class.getName());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.bootwar.main;
|
||||
|
||||
/**
|
||||
* Application used for testing {@code BootRun}'s main class configuration.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class CustomMainClass {
|
||||
|
||||
protected CustomMainClass() {
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(CustomMainClass.class.getName());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,6 +19,7 @@ package org.springframework.boot.gradle.tasks.bundling;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Locale;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.JarEntry;
|
||||
@@ -196,7 +197,8 @@ abstract class AbstractBootArchiveIntegrationTests {
|
||||
.isEqualTo(TaskOutcome.SUCCESS);
|
||||
try (JarFile jarFile = new JarFile(new File(this.gradleBuild.getProjectDir(), "build/libs").listFiles()[0])) {
|
||||
Attributes mainAttributes = jarFile.getManifest().getMainAttributes();
|
||||
assertThat(mainAttributes.getValue("Start-Class")).isEqualTo("com.example.main.CustomMainClass");
|
||||
assertThat(mainAttributes.getValue("Start-Class"))
|
||||
.isEqualTo("com.example." + this.taskName.toLowerCase(Locale.ENGLISH) + ".main.CustomMainClass");
|
||||
}
|
||||
assertThat(this.gradleBuild.build(this.taskName).task(":" + this.taskName).getOutcome())
|
||||
.isEqualTo(TaskOutcome.UP_TO_DATE);
|
||||
@@ -206,10 +208,13 @@ abstract class AbstractBootArchiveIntegrationTests {
|
||||
copyApplication("main");
|
||||
}
|
||||
|
||||
private void copyApplication(String name) throws IOException {
|
||||
File output = new File(this.gradleBuild.getProjectDir(), "src/main/java/com/example/" + name);
|
||||
protected void copyApplication(String name) throws IOException {
|
||||
File output = new File(this.gradleBuild.getProjectDir(),
|
||||
"src/main/java/com/example/" + this.taskName.toLowerCase() + "/" + name);
|
||||
output.mkdirs();
|
||||
FileSystemUtils.copyRecursively(new File("src/test/java/com/example/" + name), output);
|
||||
FileSystemUtils.copyRecursively(
|
||||
new File("src/test/java/com/example/" + this.taskName.toLowerCase(Locale.ENGLISH) + "/" + name),
|
||||
output);
|
||||
}
|
||||
|
||||
private void createStandardJar(File location) throws IOException {
|
||||
|
||||
@@ -296,6 +296,30 @@ class BootJarIntegrationTests extends AbstractBootArchiveIntegrationTests {
|
||||
.isEqualTo(TaskOutcome.SUCCESS);
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
void packagedApplicationClasspath() throws IOException {
|
||||
copyClasspathApplication();
|
||||
BuildResult result = this.gradleBuild.build("launch");
|
||||
String output = result.getOutput();
|
||||
assertThat(output).containsPattern("1\\. .*classes");
|
||||
assertThat(output).containsPattern("2\\. .*library-1.0-SNAPSHOT.jar");
|
||||
assertThat(output).containsPattern("3\\. .*commons-lang3-3.9.jar");
|
||||
assertThat(output).containsPattern("4\\. .*spring-boot-jarmode-layertools-.*.jar");
|
||||
assertThat(output).doesNotContain("5. ");
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
void explodedApplicationClasspath() throws IOException {
|
||||
copyClasspathApplication();
|
||||
BuildResult result = this.gradleBuild.build("launch");
|
||||
String output = result.getOutput();
|
||||
assertThat(output).containsPattern("1\\. .*classes");
|
||||
assertThat(output).containsPattern("2\\. .*spring-boot-jarmode-layertools-.*.jar");
|
||||
assertThat(output).containsPattern("3\\. .*library-1.0-SNAPSHOT.jar");
|
||||
assertThat(output).containsPattern("4\\. .*commons-lang3-3.9.jar");
|
||||
assertThat(output).doesNotContain("5. ");
|
||||
}
|
||||
|
||||
private void assertExtractedLayers(List<String> layerNames, Map<String, List<String>> indexedLayers)
|
||||
throws IOException {
|
||||
Map<String, List<String>> extractedLayers = readExtractedLayers(this.gradleBuild.getProjectDir(), layerNames);
|
||||
@@ -395,4 +419,8 @@ class BootJarIntegrationTests extends AbstractBootArchiveIntegrationTests {
|
||||
return extractedLayers;
|
||||
}
|
||||
|
||||
private void copyClasspathApplication() throws IOException {
|
||||
copyApplication("classpath");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
* Copyright 2012-2021 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.
|
||||
@@ -230,9 +230,10 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> {
|
||||
@Test
|
||||
void whenJarIsLayeredClasspathIndexPointsToLayeredLibs() throws IOException {
|
||||
try (JarFile jarFile = new JarFile(createLayeredJar())) {
|
||||
assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly("- \"first-library.jar\"",
|
||||
"- \"second-library.jar\"", "- \"third-library-SNAPSHOT.jar\"", "- \"first-project-library.jar\"",
|
||||
"- \"second-project-library-SNAPSHOT.jar\"");
|
||||
assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly(
|
||||
"- \"BOOT-INF/lib/first-library.jar\"", "- \"BOOT-INF/lib/second-library.jar\"",
|
||||
"- \"BOOT-INF/lib/third-library-SNAPSHOT.jar\"", "- \"BOOT-INF/lib/first-project-library.jar\"",
|
||||
"- \"BOOT-INF/lib/second-project-library-SNAPSHOT.jar\"");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,9 +255,10 @@ class BootJarTests extends AbstractBootArchiveTests<BootJar> {
|
||||
try (JarFile jarFile = new JarFile(createPopulatedJar())) {
|
||||
assertThat(jarFile.getManifest().getMainAttributes().getValue("Spring-Boot-Classpath-Index"))
|
||||
.isEqualTo("BOOT-INF/classpath.idx");
|
||||
assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly("- \"first-library.jar\"",
|
||||
"- \"second-library.jar\"", "- \"third-library-SNAPSHOT.jar\"", "- \"first-project-library.jar\"",
|
||||
"- \"second-project-library-SNAPSHOT.jar\"");
|
||||
assertThat(entryLines(jarFile, "BOOT-INF/classpath.idx")).containsExactly(
|
||||
"- \"BOOT-INF/lib/first-library.jar\"", "- \"BOOT-INF/lib/second-library.jar\"",
|
||||
"- \"BOOT-INF/lib/third-library-SNAPSHOT.jar\"", "- \"BOOT-INF/lib/first-project-library.jar\"",
|
||||
"- \"BOOT-INF/lib/second-project-library-SNAPSHOT.jar\"");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ class BootRunIntegrationTests {
|
||||
copyMainClassApplication();
|
||||
BuildResult result = this.gradleBuild.build("bootRun");
|
||||
assertThat(result.task(":bootRun").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
|
||||
assertThat(result.getOutput()).contains("com.example.main.CustomMainClass");
|
||||
assertThat(result.getOutput()).contains("com.example.bootrun.main.CustomMainClass");
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
@@ -79,7 +79,7 @@ class BootRunIntegrationTests {
|
||||
copyMainClassApplication();
|
||||
BuildResult result = this.gradleBuild.build("bootRun");
|
||||
assertThat(result.task(":bootRun").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
|
||||
assertThat(result.getOutput()).contains("com.example.main.CustomMainClass");
|
||||
assertThat(result.getOutput()).contains("com.example.bootrun.main.CustomMainClass");
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
@@ -87,7 +87,8 @@ class BootRunIntegrationTests {
|
||||
copyClasspathApplication();
|
||||
BuildResult result = this.gradleBuild.build("bootRun");
|
||||
assertThat(result.task(":bootRun").getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
|
||||
assertThat(result.getOutput()).contains("Main class name = com.example.classpath.BootRunClasspathApplication");
|
||||
assertThat(result.getOutput())
|
||||
.contains("Main class name = com.example.bootrun.classpath.BootRunClasspathApplication");
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
@@ -150,9 +151,9 @@ class BootRunIntegrationTests {
|
||||
}
|
||||
|
||||
private void copyApplication(String name) throws IOException {
|
||||
File output = new File(this.gradleBuild.getProjectDir(), "src/main/java/com/example/" + name);
|
||||
File output = new File(this.gradleBuild.getProjectDir(), "src/main/java/com/example/bootrun/" + name);
|
||||
output.mkdirs();
|
||||
FileSystemUtils.copyRecursively(new File("src/test/java/com/example/" + name), output);
|
||||
FileSystemUtils.copyRecursively(new File("src/test/java/com/example/bootrun/" + name), output);
|
||||
}
|
||||
|
||||
private String canonicalPathOf(String path) throws IOException {
|
||||
|
||||
Reference in New Issue
Block a user