-
Notifications
You must be signed in to change notification settings - Fork 40.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Write native-image argfile only if there are excludes
Refactors duplicate logic in BootZipCopyAction and Packager into separate classes. Closes gh-33363 Co-authored-by: Phillip Webb <[email protected]>
- Loading branch information
1 parent
276b288
commit c6536c5
Showing
7 changed files
with
275 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
69 changes: 69 additions & 0 deletions
69
...-loader-tools/src/main/java/org/springframework/boot/loader/tools/NativeImageArgFile.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
* 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. | ||
* 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.util.ArrayList; | ||
import java.util.Collection; | ||
import java.util.List; | ||
import java.util.regex.Pattern; | ||
|
||
import org.springframework.util.function.ThrowingConsumer; | ||
|
||
/** | ||
* Class to work with the native-image argfile. | ||
* | ||
* @author Moritz Halbritter | ||
* @author Phil Webb | ||
* @since 3.0.0 | ||
*/ | ||
public final class NativeImageArgFile { | ||
|
||
/** | ||
* Location of the argfile. | ||
*/ | ||
public static final String LOCATION = "META-INF/native-image/argfile"; | ||
|
||
private final List<String> excludes; | ||
|
||
/** | ||
* Constructs a new instance with the given excludes. | ||
* @param excludes dependencies for which the reachability metadata should be excluded | ||
*/ | ||
public NativeImageArgFile(Collection<String> excludes) { | ||
this.excludes = List.copyOf(excludes); | ||
} | ||
|
||
/** | ||
* Write the arguments file if it is necessary. | ||
* @param writer consumer that should write the contents | ||
*/ | ||
public void writeIfNecessary(ThrowingConsumer<List<String>> writer) { | ||
if (this.excludes.isEmpty()) { | ||
return; | ||
} | ||
List<String> lines = new ArrayList<>(); | ||
for (String exclude : this.excludes) { | ||
int lastSlash = exclude.lastIndexOf('/'); | ||
String jar = (lastSlash != -1) ? exclude.substring(lastSlash + 1) : exclude; | ||
lines.add("--exclude-config"); | ||
lines.add(Pattern.quote(jar)); | ||
lines.add("^/META-INF/native-image/.*"); | ||
} | ||
writer.accept(lines); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
75 changes: 75 additions & 0 deletions
75
...s/src/main/java/org/springframework/boot/loader/tools/ReachabilityMetadataProperties.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* | ||
* 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. | ||
* 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.IOException; | ||
import java.io.InputStream; | ||
import java.util.Properties; | ||
|
||
/** | ||
* Class to work with {@code reachability-metadata.properties}. | ||
* | ||
* @author Moritz Halbritter | ||
* @since 3.0.0 | ||
*/ | ||
public final class ReachabilityMetadataProperties { | ||
|
||
/** | ||
* Location of the properties file. Must be formatted using | ||
* {@link String#format(String, Object...)} with the group id, artifact id and version | ||
* of the dependency. | ||
*/ | ||
public static final String REACHABILITY_METADATA_PROPERTIES_LOCATION_TEMPLATE = "META-INF/native-image/%s/%s/%s/reachability-metadata.properties"; | ||
|
||
private final Properties properties; | ||
|
||
private ReachabilityMetadataProperties(Properties properties) { | ||
this.properties = properties; | ||
} | ||
|
||
/** | ||
* Returns if the dependency has been overridden. | ||
* @return true if the dependency has been overridden | ||
*/ | ||
public boolean isOverridden() { | ||
return Boolean.parseBoolean(this.properties.getProperty("override")); | ||
} | ||
|
||
/** | ||
* Constructs a new instance from the given {@code InputStream}. | ||
* @param inputStream {@code InputStream} to load the properties from | ||
* @return loaded properties | ||
* @throws IOException if loading from the {@code InputStream} went wrong | ||
*/ | ||
public static ReachabilityMetadataProperties fromInputStream(InputStream inputStream) throws IOException { | ||
Properties properties = new Properties(); | ||
properties.load(inputStream); | ||
return new ReachabilityMetadataProperties(properties); | ||
} | ||
|
||
/** | ||
* Returns the location of the properties for the given coordinates. | ||
* @param coordinates library coordinates for which the property file location should | ||
* be returned | ||
* @return location of the properties | ||
*/ | ||
public static String getLocation(LibraryCoordinates coordinates) { | ||
return REACHABILITY_METADATA_PROPERTIES_LOCATION_TEMPLATE.formatted(coordinates.getGroupId(), | ||
coordinates.getArtifactId(), coordinates.getVersion()); | ||
} | ||
|
||
} |
50 changes: 50 additions & 0 deletions
50
...er-tools/src/test/java/org/springframework/boot/loader/tools/NativeImageArgFileTests.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/* | ||
* 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. | ||
* 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.util.ArrayList; | ||
import java.util.Collections; | ||
import java.util.List; | ||
|
||
import org.junit.jupiter.api.Test; | ||
|
||
import static org.assertj.core.api.Assertions.assertThat; | ||
import static org.assertj.core.api.Assertions.fail; | ||
|
||
/** | ||
* Tests for @{link NativeImageArgFile}. | ||
* | ||
* @author Moritz Halbritter | ||
*/ | ||
class NativeImageArgFileTests { | ||
|
||
@Test | ||
void writeIfNecessaryWhenHasExcludesWritesLines() { | ||
NativeImageArgFile argFile = new NativeImageArgFile(List.of("path/to/dependency-1.jar", "dependency-2.jar")); | ||
List<String> lines = new ArrayList<>(); | ||
argFile.writeIfNecessary(lines::addAll); | ||
assertThat(lines).containsExactly("--exclude-config", "\\Qdependency-1.jar\\E", "^/META-INF/native-image/.*", | ||
"--exclude-config", "\\Qdependency-2.jar\\E", "^/META-INF/native-image/.*"); | ||
} | ||
|
||
@Test | ||
void writeIfNecessaryWhenHasNothingDoesNotCallConsumer() { | ||
NativeImageArgFile argFile = new NativeImageArgFile(Collections.emptyList()); | ||
argFile.writeIfNecessary((lines) -> fail("Should not be called")); | ||
} | ||
|
||
} |
Oops, something went wrong.