Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
2dd4010e
Commit
2dd4010e
authored
Mar 19, 2021
by
Scott Frederick
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '2.4.x'
Closes gh-25701
parents
fb670ee6
6f860b44
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
92 additions
and
16 deletions
+92
-16
ImagePackager.java
.../org/springframework/boot/loader/tools/ImagePackager.java
+8
-3
Packager.java
.../java/org/springframework/boot/loader/tools/Packager.java
+8
-5
BuildImageTests.java
.../java/org/springframework/boot/maven/BuildImageTests.java
+11
-5
pom.xml
...lugin/src/intTest/projects/build-image-final-name/pom.xml
+33
-0
SampleApplication.java
...-final-name/src/main/java/org/test/SampleApplication.java
+28
-0
BuildImageMojo.java
...n/java/org/springframework/boot/maven/BuildImageMojo.java
+4
-3
No files found.
spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/ImagePackager.java
View file @
2dd4010e
...
...
@@ -28,6 +28,7 @@ import org.springframework.util.Assert;
* Utility class that can be used to export a fully packaged archive to an OCI image.
*
* @author Phillip Webb
* @author Scott Frederick
* @since 2.3.0
*/
public
class
ImagePackager
extends
Packager
{
...
...
@@ -38,10 +39,14 @@ public class ImagePackager extends Packager {
*/
public
ImagePackager
(
File
source
)
{
super
(
source
,
null
);
if
(
isAlreadyPackaged
())
{
Assert
.
isTrue
(
getBackupFile
().
exists
()
&&
getBackupFile
().
isFile
(),
"Original source '"
+
getBackupFile
()
+
"' is required for building an image"
);
}
}
/**
* Create a
n
packaged image.
* Create a packaged image.
* @param libraries the contained libraries
* @param exporter the exporter used to write the image
* @throws IOException on IO error
...
...
@@ -52,8 +57,8 @@ public class ImagePackager extends Packager {
private
void
packageImage
(
Libraries
libraries
,
AbstractJarWriter
writer
)
throws
IOException
{
File
source
=
isAlreadyPackaged
()
?
getBackupFile
()
:
getSource
();
Assert
.
state
(
source
.
exists
()
&&
source
.
isFile
(),
()
->
"Unable to read jar file "
+
source
);
Assert
.
state
(!
isAlreadyPackaged
(
source
),
()
->
"Repackaged jar file "
+
source
+
" cannot be exported
"
);
Assert
.
state
(
!
isAlreadyPackaged
(
source
),
()
->
"Repackaged archive file "
+
source
+
" cannot be used to build an image
"
);
try
(
JarFile
sourceJar
=
new
JarFile
(
source
))
{
write
(
sourceJar
,
libraries
,
writer
);
}
...
...
spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Packager.java
View file @
2dd4010e
...
...
@@ -45,6 +45,7 @@ import org.springframework.util.StringUtils;
* @author Andy Wilkinson
* @author Stephane Nicoll
* @author Madhura Bhave
* @author Scott Frederick
* @since 2.3.0
*/
public
abstract
class
Packager
{
...
...
@@ -69,7 +70,7 @@ public abstract class Packager {
private
static
final
String
SPRING_BOOT_APPLICATION_CLASS_NAME
=
"org.springframework.boot.autoconfigure.SpringBootApplication"
;
private
List
<
MainClassTimeoutWarningListener
>
mainClassTimeoutListeners
=
new
ArrayList
<>();
private
final
List
<
MainClassTimeoutWarningListener
>
mainClassTimeoutListeners
=
new
ArrayList
<>();
private
String
mainClass
;
...
...
@@ -153,15 +154,18 @@ public abstract class Packager {
this
.
includeRelevantJarModeJars
=
includeRelevantJarModeJars
;
}
protected
final
boolean
isAlreadyPackaged
()
throws
IOException
{
protected
final
boolean
isAlreadyPackaged
()
{
return
isAlreadyPackaged
(
this
.
source
);
}
protected
final
boolean
isAlreadyPackaged
(
File
file
)
throws
IOException
{
protected
final
boolean
isAlreadyPackaged
(
File
file
)
{
try
(
JarFile
jarFile
=
new
JarFile
(
file
))
{
Manifest
manifest
=
jarFile
.
getManifest
();
return
(
manifest
!=
null
&&
manifest
.
getMainAttributes
().
getValue
(
BOOT_VERSION_ATTRIBUTE
)
!=
null
);
}
catch
(
IOException
ex
)
{
throw
new
IllegalStateException
(
"Error reading archive file"
,
ex
);
}
}
protected
final
void
write
(
JarFile
sourceJar
,
Libraries
libraries
,
AbstractJarWriter
writer
)
throws
IOException
{
...
...
@@ -287,8 +291,7 @@ public abstract class Packager {
* @return the file to use to backup the original source
*/
public
final
File
getBackupFile
()
{
File
source
=
getSource
();
return
new
File
(
source
.
getParentFile
(),
source
.
getName
()
+
".original"
);
return
new
File
(
this
.
source
.
getParentFile
(),
this
.
source
.
getName
()
+
".original"
);
}
protected
final
File
getSource
()
{
...
...
spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/java/org/springframework/boot/maven/BuildImageTests.java
View file @
2dd4010e
...
...
@@ -70,16 +70,15 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests {
@TestTemplate
void
whenBuildImageIsInvokedWithRepackageTheExistingArchiveIsUsed
(
MavenBuild
mavenBuild
)
{
mavenBuild
.
project
(
"build-image-with-repackage"
).
goals
(
"package"
).
prepare
(
this
::
writeLongNameResource
)
.
execute
((
project
)
->
{
mavenBuild
.
project
(
"build-image-with-repackage"
).
goals
(
"package"
)
.
systemProperty
(
"spring-boot.build-image.pullPolicy"
,
"IF_NOT_PRESENT"
)
.
prepare
(
this
::
writeLongNameResource
).
execute
((
project
)
->
{
File
jar
=
new
File
(
project
,
"target/build-image-with-repackage-0.0.1.BUILD-SNAPSHOT.jar"
);
assertThat
(
jar
).
isFile
();
File
original
=
new
File
(
project
,
"target/build-image-with-repackage-0.0.1.BUILD-SNAPSHOT.jar.original"
);
assertThat
(
original
).
isFile
();
String
log
=
buildLog
(
project
);
System
.
out
.
println
(
log
);
assertThat
(
log
).
contains
(
"Building image"
)
assertThat
(
buildLog
(
project
)).
contains
(
"Building image"
)
.
contains
(
"docker.io/library/build-image-with-repackage:0.0.1.BUILD-SNAPSHOT"
)
.
contains
(
"Successfully built image"
);
ImageReference
imageReference
=
ImageReference
.
of
(
ImageName
.
of
(
"build-image-with-repackage"
),
...
...
@@ -248,6 +247,13 @@ public class BuildImageTests extends AbstractArchiveIntegrationTests {
.
contains
(
"'urn:cnb:builder:example/does-not-exist:0.0.1' not found in builder"
));
}
@TestTemplate
void
failsWhenFinalNameIsMisconfigured
(
MavenBuild
mavenBuild
)
{
mavenBuild
.
project
(
"build-image-final-name"
).
goals
(
"package"
)
.
executeAndFail
((
project
)
->
assertThat
(
buildLog
(
project
)).
contains
(
"final-name.jar.original"
)
.
contains
(
"is required for building an image"
));
}
private
void
writeLongNameResource
(
File
project
)
{
StringBuilder
name
=
new
StringBuilder
();
new
Random
().
ints
(
'a'
,
'z'
+
1
).
limit
(
128
).
forEach
((
i
)
->
name
.
append
((
char
)
i
));
...
...
spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-final-name/pom.xml
0 → 100644
View file @
2dd4010e
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
org.springframework.boot.maven.it
</groupId>
<artifactId>
build-image-final-name
</artifactId>
<version>
0.0.1.BUILD-SNAPSHOT
</version>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<maven.compiler.source>
@java.version@
</maven.compiler.source>
<maven.compiler.target>
@java.version@
</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>
@project.groupId@
</groupId>
<artifactId>
@project.artifactId@
</artifactId>
<version>
@project.version@
</version>
<executions>
<execution>
<goals>
<goal>
repackage
</goal>
<goal>
build-image
</goal>
</goals>
<configuration>
<finalName>
final-name
</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/intTest/projects/build-image-final-name/src/main/java/org/test/SampleApplication.java
0 → 100644
View file @
2dd4010e
/*
* 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
.
test
;
public
class
SampleApplication
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
System
.
out
.
println
(
"Launched"
);
synchronized
(
args
)
{
args
.
wait
();
// Prevent exit"
}
}
}
spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/BuildImageMojo.java
View file @
2dd4010e
...
...
@@ -186,7 +186,8 @@ public class BuildImageMojo extends AbstractPackagerMojo {
}
private
BuildRequest
getBuildRequest
(
Libraries
libraries
)
throws
MojoExecutionException
{
Function
<
Owner
,
TarArchive
>
content
=
(
owner
)
->
getApplicationContent
(
owner
,
libraries
);
ImagePackager
imagePackager
=
new
ImagePackager
(
getArchiveFile
());
Function
<
Owner
,
TarArchive
>
content
=
(
owner
)
->
getApplicationContent
(
owner
,
libraries
,
imagePackager
);
Image
image
=
(
this
.
image
!=
null
)
?
this
.
image
:
new
Image
();
if
(
image
.
name
==
null
&&
this
.
imageName
!=
null
)
{
image
.
setName
(
this
.
imageName
);
...
...
@@ -217,8 +218,8 @@ public class BuildImageMojo extends AbstractPackagerMojo {
||
this
.
docker
.
getPublishRegistry
().
isEmpty
();
}
private
TarArchive
getApplicationContent
(
Owner
owner
,
Libraries
libraries
)
{
ImagePackager
packager
=
getConfiguredPackager
(()
->
new
ImagePackager
(
getArchiveFile
())
);
private
TarArchive
getApplicationContent
(
Owner
owner
,
Libraries
libraries
,
ImagePackager
imagePackager
)
{
ImagePackager
packager
=
getConfiguredPackager
(()
->
imagePackager
);
return
new
PackagedTarArchive
(
owner
,
libraries
,
packager
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment