Skip to content

Commit

Permalink
Only apply special handling of META-INF to jar files
Browse files Browse the repository at this point in the history
The changes for gh-28562 attempted to align the Gradle plugin's
handling of META-INF with the Maven plugin's behavior. Unfortunately,
they want too far, applying the handling to both jar and war files
when the Maven plugin only applies it to jar files.

This commit reworks the changes so that they only apply to jar files.

Closes gh-30026
  • Loading branch information
wilkinsona committed Mar 2, 2022
1 parent b43715c commit 4073cf8
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 74 deletions.
Expand Up @@ -179,19 +179,10 @@ private boolean isZip(InputStream inputStream) throws IOException {
}

void moveModuleInfoToRoot(CopySpec spec) {
spec.filesMatching("module-info.class", BootArchiveSupport::moveToRoot);
spec.filesMatching("module-info.class", this::moveToRoot);
}

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")) {
moveToRoot(file);
}
});
}

private static void moveToRoot(FileCopyDetails details) {
void moveToRoot(FileCopyDetails details) {
details.setRelativePath(details.getRelativeSourcePath());
}

Expand Down
Expand Up @@ -92,7 +92,7 @@ private void configureBootInfSpec(CopySpec bootInfSpec) {
bootInfSpec.into("classes", fromCallTo(this::classpathDirectories));
bootInfSpec.into("lib", fromCallTo(this::classpathFiles)).eachFile(this.support::excludeNonZipFiles);
this.support.moveModuleInfoToRoot(bootInfSpec);
this.support.moveMetaInfToRoot(bootInfSpec);
moveMetaInfToRoot(bootInfSpec);
}

private Iterable<File> classpathDirectories() {
Expand All @@ -107,6 +107,15 @@ private Iterable<File> classpathEntries(Spec<File> filter) {
return (this.classpath != null) ? this.classpath.filter(filter) : Collections.emptyList();
}

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")) {
this.support.moveToRoot(file);
}
});
}

@Override
public void copy() {
this.support.configureManifest(getManifest(), getMainClass().get(), CLASSES_DIRECTORY, LIB_DIRECTORY,
Expand Down
Expand Up @@ -74,7 +74,6 @@ public BootWar() {
this.mainClass = project.getObjects().property(String.class);
getWebInf().into("lib-provided", fromCallTo(this::getProvidedLibFiles));
this.support.moveModuleInfoToRoot(getRootSpec());
this.support.moveMetaInfToRoot(getRootSpec());
getRootSpec().eachFile(this.support::excludeNonZipLibraryFiles);
project.getConfigurations().all((configuration) -> {
ResolvableDependencies incoming = configuration.getIncoming();
Expand Down
Expand Up @@ -185,66 +185,6 @@ void moduleInfoClassIsPackagedInTheRootOfTheArchive() throws IOException {
}
}

@Test
void metaInfEntryIsPackagedInTheRootOfTheArchive() throws IOException {
this.task.getMainClass().set("com.example.Main");
File classpathDirectory = new File(this.temp, "classes");
File metaInfEntry = new File(classpathDirectory, "META-INF/test");
metaInfEntry.getParentFile().mkdirs();
metaInfEntry.createNewFile();
File applicationClass = new File(classpathDirectory, "com/example/Application.class");
applicationClass.getParentFile().mkdirs();
applicationClass.createNewFile();
this.task.classpath(classpathDirectory);
executeTask();
try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) {
assertThat(jarFile.getEntry(this.classesPath + "com/example/Application.class")).isNotNull();
assertThat(jarFile.getEntry("com/example/Application.class")).isNull();
assertThat(jarFile.getEntry(this.classesPath + "META-INF/test")).isNull();
assertThat(jarFile.getEntry("META-INF/test")).isNotNull();
}
}

@Test
void aopXmlIsPackagedBeneathClassesDirectory() throws IOException {
this.task.getMainClass().set("com.example.Main");
File classpathDirectory = new File(this.temp, "classes");
File aopXml = new File(classpathDirectory, "META-INF/aop.xml");
aopXml.getParentFile().mkdirs();
aopXml.createNewFile();
File applicationClass = new File(classpathDirectory, "com/example/Application.class");
applicationClass.getParentFile().mkdirs();
applicationClass.createNewFile();
this.task.classpath(classpathDirectory);
executeTask();
try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) {
assertThat(jarFile.getEntry(this.classesPath + "com/example/Application.class")).isNotNull();
assertThat(jarFile.getEntry("com/example/Application.class")).isNull();
assertThat(jarFile.getEntry(this.classesPath + "META-INF/aop.xml")).isNotNull();
assertThat(jarFile.getEntry("META-INF/aop.xml")).isNull();
}
}

@Test
void kotlinModuleIsPackagedBeneathClassesDirectory() throws IOException {
this.task.getMainClass().set("com.example.Main");
File classpathDirectory = new File(this.temp, "classes");
File kotlinModule = new File(classpathDirectory, "META-INF/example.kotlin_module");
kotlinModule.getParentFile().mkdirs();
kotlinModule.createNewFile();
File applicationClass = new File(classpathDirectory, "com/example/Application.class");
applicationClass.getParentFile().mkdirs();
applicationClass.createNewFile();
this.task.classpath(classpathDirectory);
executeTask();
try (JarFile jarFile = new JarFile(this.task.getArchiveFile().get().getAsFile())) {
assertThat(jarFile.getEntry(this.classesPath + "com/example/Application.class")).isNotNull();
assertThat(jarFile.getEntry("com/example/Application.class")).isNull();
assertThat(jarFile.getEntry(this.classesPath + "META-INF/example.kotlin_module")).isNotNull();
assertThat(jarFile.getEntry("META-INF/example.kotlin_module")).isNull();
}
}

@Test
void classpathCanBeSetUsingAFileCollection() throws IOException {
this.task.getMainClass().set("com.example.Main");
Expand Down
@@ -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.
Expand Down Expand Up @@ -103,6 +103,66 @@ void classpathIndexPointsToBootInfLibs() throws IOException {
}
}

@Test
void metaInfEntryIsPackagedInTheRootOfTheArchive() throws IOException {
getTask().getMainClass().set("com.example.Main");
File classpathDirectory = new File(this.temp, "classes");
File metaInfEntry = new File(classpathDirectory, "META-INF/test");
metaInfEntry.getParentFile().mkdirs();
metaInfEntry.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/test")).isNull();
assertThat(jarFile.getEntry("META-INF/test")).isNotNull();
}
}

@Test
void aopXmlIsPackagedBeneathClassesDirectory() throws IOException {
getTask().getMainClass().set("com.example.Main");
File classpathDirectory = new File(this.temp, "classes");
File aopXml = new File(classpathDirectory, "META-INF/aop.xml");
aopXml.getParentFile().mkdirs();
aopXml.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/aop.xml")).isNotNull();
assertThat(jarFile.getEntry("META-INF/aop.xml")).isNull();
}
}

@Test
void kotlinModuleIsPackagedBeneathClassesDirectory() throws IOException {
getTask().getMainClass().set("com.example.Main");
File classpathDirectory = new File(this.temp, "classes");
File kotlinModule = new File(classpathDirectory, "META-INF/example.kotlin_module");
kotlinModule.getParentFile().mkdirs();
kotlinModule.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/example.kotlin_module")).isNotNull();
assertThat(jarFile.getEntry("META-INF/example.kotlin_module")).isNull();
}
}

private File createPopulatedJar() throws IOException {
addContent();
executeTask();
Expand Down

0 comments on commit 4073cf8

Please sign in to comment.