Support flat jar layering with Maven
Update the Maven plugin so that layered jars now use the regular "flat" format. The layers.idx file now describes which layer each file should be placed. See gh-20813 Co-authored-by: Phillip Webb <pwebb@pivotal.io>pull/20830/head
parent
3f806aa513
commit
4e3cdf936f
@ -1,55 +0,0 @@
|
||||
/*
|
||||
* 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 org.springframework.boot.loader.tools;
|
||||
|
||||
/**
|
||||
* A specialization of {@link RepackagingLayout} that supports layers in the repackaged
|
||||
* archive.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
* @author Phillip Webb
|
||||
* @since 2.3.0
|
||||
*/
|
||||
public interface LayeredLayout extends RepackagingLayout {
|
||||
|
||||
/**
|
||||
* Returns the location of the layers index file that should be written or
|
||||
* {@code null} if not index is required. The result should include the filename and
|
||||
* is relative to the root of the jar.
|
||||
* @return the layers index file location
|
||||
*/
|
||||
String getLayersIndexFileLocation();
|
||||
|
||||
/**
|
||||
* Returns the location to which classes should be moved within the context of a
|
||||
* layer.
|
||||
* @param layer the destination layer for the content
|
||||
* @return the repackaged classes location
|
||||
*/
|
||||
String getRepackagedClassesLocation(Layer layer);
|
||||
|
||||
/**
|
||||
* Returns the destination path for a given library within the context of a layer.
|
||||
* @param libraryName the name of the library (excluding any path)
|
||||
* @param scope the scope of the library
|
||||
* @param layer the destination layer for the content
|
||||
* @return the location of the library relative to the root of the archive (should end
|
||||
* with '/') or {@code null} if the library should not be included.
|
||||
*/
|
||||
String getLibraryLocation(String libraryName, LibraryScope scope, Layer layer);
|
||||
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* 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 org.springframework.boot.loader.tools;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
/**
|
||||
* Index describing the layer to which each entry in a jar belongs.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
* @author Andy Wilkinson
|
||||
* @since 2.3.0
|
||||
*/
|
||||
public class LayersIndex {
|
||||
|
||||
private final Iterable<Layer> layers;
|
||||
|
||||
private final MultiValueMap<Layer, String> index = new LinkedMultiValueMap<>();
|
||||
|
||||
/**
|
||||
* Create a new {@link LayersIndex} backed by the given layers.
|
||||
* @param layers the layers in the index
|
||||
*/
|
||||
public LayersIndex(Iterable<Layer> layers) {
|
||||
this.layers = layers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an item to the index.
|
||||
* @param layer the layer of the item
|
||||
* @param name the name of the item
|
||||
*/
|
||||
public void add(Layer layer, String name) {
|
||||
this.index.add(layer, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the layer index to an output stream.
|
||||
* @param out the destination stream
|
||||
* @throws IOException on IO error
|
||||
*/
|
||||
public void writeTo(OutputStream out) throws IOException {
|
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
|
||||
for (Layer layer : this.layers) {
|
||||
List<String> names = this.index.get(layer);
|
||||
if (names != null) {
|
||||
for (String name : names) {
|
||||
writer.write(layer.toString());
|
||||
writer.write(" ");
|
||||
writer.write(name);
|
||||
writer.write("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
writer.flush();
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue