Skip to content

Commit f206fa8

Browse files
authored
Merge pull request #46234 from geoand/appcds-refactor
Refactor AppCDS handling now that we support JEP 483 in addition to AppCDS
2 parents 1fe7eaf + 416e22b commit f206fa8

File tree

16 files changed

+136
-194
lines changed

16 files changed

+136
-194
lines changed

core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/AppCDSControlPointBuildItem.java

-11
This file was deleted.

core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/AppCDSRequestedBuildItem.java

-35
This file was deleted.

core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/AppCDSResultBuildItem.java

-37
This file was deleted.

core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/AppCDSContainerImageBuildItem.java core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/JvmStartupOptimizerArchiveContainerImageBuildItem.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
/**
66
* Indicates that a specific container image should be used to generate the AppCDS file
77
*/
8-
public final class AppCDSContainerImageBuildItem extends SimpleBuildItem {
8+
public final class JvmStartupOptimizerArchiveContainerImageBuildItem extends SimpleBuildItem {
99

1010
private final String containerImage;
1111

12-
public AppCDSContainerImageBuildItem(String containerImage) {
12+
public JvmStartupOptimizerArchiveContainerImageBuildItem(String containerImage) {
1313
this.containerImage = containerImage;
1414
}
1515

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.quarkus.deployment.pkg.builditem;
2+
3+
import java.nio.file.Path;
4+
5+
import io.quarkus.builder.item.SimpleBuildItem;
6+
7+
/**
8+
* Build item to indicate to the various steps that generation
9+
* of a JVM startup archive has been requested
10+
*/
11+
public final class JvmStartupOptimizerArchiveRequestedBuildItem extends SimpleBuildItem {
12+
13+
/**
14+
* Directory where various files needed for JVM startup archive generation will reside
15+
*/
16+
private final Path dir;
17+
private final JvmStartupOptimizerArchiveType type;
18+
19+
public JvmStartupOptimizerArchiveRequestedBuildItem(Path dir, JvmStartupOptimizerArchiveType type) {
20+
this.dir = dir;
21+
this.type = type;
22+
}
23+
24+
public Path getDir() {
25+
return dir;
26+
}
27+
28+
public JvmStartupOptimizerArchiveType getType() {
29+
return type;
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.quarkus.deployment.pkg.builditem;
2+
3+
import java.nio.file.Path;
4+
5+
import io.quarkus.builder.item.SimpleBuildItem;
6+
7+
/**
8+
* A build item containing the result of the JVM startup archive generation process
9+
*/
10+
public final class JvmStartupOptimizerArchiveResultBuildItem extends SimpleBuildItem {
11+
12+
/**
13+
* The file containing the generated archive
14+
*/
15+
private final Path archive;
16+
/**
17+
* The type of archive generated
18+
*/
19+
private final JvmStartupOptimizerArchiveType type;
20+
21+
public JvmStartupOptimizerArchiveResultBuildItem(Path archive) {
22+
this(archive, JvmStartupOptimizerArchiveType.AppCDS);
23+
}
24+
25+
public JvmStartupOptimizerArchiveResultBuildItem(Path archive, JvmStartupOptimizerArchiveType type) {
26+
this.archive = archive;
27+
this.type = type;
28+
}
29+
30+
public Path getArchive() {
31+
return archive;
32+
}
33+
34+
public JvmStartupOptimizerArchiveType getType() {
35+
return type;
36+
}
37+
}

core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/JarResultBuildStep.java

+11-7
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@
6969
import io.quarkus.deployment.builditem.TransformedClassesBuildItem;
7070
import io.quarkus.deployment.configuration.ClassLoadingConfig;
7171
import io.quarkus.deployment.pkg.PackageConfig;
72-
import io.quarkus.deployment.pkg.builditem.AppCDSRequestedBuildItem;
7372
import io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem;
7473
import io.quarkus.deployment.pkg.builditem.BuildSystemTargetBuildItem;
7574
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
7675
import io.quarkus.deployment.pkg.builditem.JarBuildItem;
76+
import io.quarkus.deployment.pkg.builditem.JvmStartupOptimizerArchiveRequestedBuildItem;
7777
import io.quarkus.deployment.pkg.builditem.NativeImageSourceJarBuildItem;
7878
import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem;
7979
import io.quarkus.deployment.pkg.builditem.UberJarIgnoredResourceBuildItem;
@@ -198,10 +198,12 @@ public JarBuildItem buildRunnerJar(CurateOutcomeBuildItem curateOutcomeBuildItem
198198
List<UberJarIgnoredResourceBuildItem> uberJarIgnoredResourceBuildItems,
199199
QuarkusBuildCloseablesBuildItem closeablesBuildItem,
200200
List<AdditionalApplicationArchiveBuildItem> additionalApplicationArchiveBuildItems,
201-
MainClassBuildItem mainClassBuildItem, Optional<AppCDSRequestedBuildItem> appCDS) throws Exception {
201+
MainClassBuildItem mainClassBuildItem,
202+
Optional<JvmStartupOptimizerArchiveRequestedBuildItem> jvmStartupOptimizerArchiveRequested)
203+
throws Exception {
202204

203-
if (appCDS.isPresent()) {
204-
handleAppCDSSupportFileGeneration(transformedClasses, generatedClasses, appCDS.get());
205+
if (jvmStartupOptimizerArchiveRequested.isPresent()) {
206+
handleAppCDSSupportFileGeneration(transformedClasses, generatedClasses, jvmStartupOptimizerArchiveRequested.get());
205207
}
206208

207209
return switch (packageConfig.jar().type()) {
@@ -224,9 +226,11 @@ public JarBuildItem buildRunnerJar(CurateOutcomeBuildItem curateOutcomeBuildItem
224226
// the idea here is to just dump the class names of the generated and transformed classes into a file
225227
// that is read at runtime when AppCDS generation is requested
226228
private void handleAppCDSSupportFileGeneration(TransformedClassesBuildItem transformedClasses,
227-
List<GeneratedClassBuildItem> generatedClasses, AppCDSRequestedBuildItem appCDS) throws IOException {
228-
Path appCDsDir = appCDS.getAppCDSDir();
229-
Path generatedClassesFile = appCDsDir.resolve("generatedAndTransformed.lst");
229+
List<GeneratedClassBuildItem> generatedClasses,
230+
JvmStartupOptimizerArchiveRequestedBuildItem jvmStartupOptimizerArchiveRequested)
231+
throws IOException {
232+
Path dir = jvmStartupOptimizerArchiveRequested.getDir();
233+
Path generatedClassesFile = dir.resolve("generatedAndTransformed.lst");
230234
try (BufferedWriter writer = Files.newBufferedWriter(generatedClassesFile, StandardOpenOption.CREATE)) {
231235
StringBuilder classes = new StringBuilder();
232236
for (GeneratedClassBuildItem generatedClass : generatedClasses) {

core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/JvmStartupOptimizerArchiveBuildStep.java

+18-17
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@
2121
import io.quarkus.deployment.annotations.BuildProducer;
2222
import io.quarkus.deployment.annotations.BuildStep;
2323
import io.quarkus.deployment.pkg.PackageConfig;
24-
import io.quarkus.deployment.pkg.builditem.AppCDSContainerImageBuildItem;
25-
import io.quarkus.deployment.pkg.builditem.AppCDSRequestedBuildItem;
26-
import io.quarkus.deployment.pkg.builditem.AppCDSResultBuildItem;
2724
import io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem;
2825
import io.quarkus.deployment.pkg.builditem.CompiledJavaVersionBuildItem;
2926
import io.quarkus.deployment.pkg.builditem.JarBuildItem;
27+
import io.quarkus.deployment.pkg.builditem.JvmStartupOptimizerArchiveContainerImageBuildItem;
28+
import io.quarkus.deployment.pkg.builditem.JvmStartupOptimizerArchiveRequestedBuildItem;
29+
import io.quarkus.deployment.pkg.builditem.JvmStartupOptimizerArchiveResultBuildItem;
3030
import io.quarkus.deployment.pkg.builditem.JvmStartupOptimizerArchiveType;
3131
import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem;
3232
import io.quarkus.deployment.steps.MainClassBuildStep;
@@ -44,30 +44,31 @@ public class JvmStartupOptimizerArchiveBuildStep {
4444

4545
@BuildStep(onlyIf = AppCDSRequired.class)
4646
public void requested(PackageConfig packageConfig, OutputTargetBuildItem outputTarget,
47-
BuildProducer<AppCDSRequestedBuildItem> producer)
47+
BuildProducer<JvmStartupOptimizerArchiveRequestedBuildItem> producer)
4848
throws IOException {
49-
Path appCDSDir = outputTarget.getOutputDirectory().resolve("appcds");
50-
IoUtils.createOrEmptyDir(appCDSDir);
49+
Path archiveDir = outputTarget.getOutputDirectory().resolve("jvmstartuparchive");
50+
IoUtils.createOrEmptyDir(archiveDir);
5151

52-
producer.produce(new AppCDSRequestedBuildItem(outputTarget.getOutputDirectory().resolve("appcds"),
53-
packageConfig.jar().appcds().useAot() ? JvmStartupOptimizerArchiveType.AOT
54-
: JvmStartupOptimizerArchiveType.AppCDS));
52+
producer.produce(
53+
new JvmStartupOptimizerArchiveRequestedBuildItem(outputTarget.getOutputDirectory().resolve("jvmstartuparchive"),
54+
packageConfig.jar().appcds().useAot() ? JvmStartupOptimizerArchiveType.AOT
55+
: JvmStartupOptimizerArchiveType.AppCDS));
5556
}
5657

5758
@BuildStep(onlyIfNot = NativeOrNativeSourcesBuild.class)
58-
public void build(Optional<AppCDSRequestedBuildItem> requested,
59+
public void build(Optional<JvmStartupOptimizerArchiveRequestedBuildItem> requested,
5960
JarBuildItem jarResult, OutputTargetBuildItem outputTarget, PackageConfig packageConfig,
6061
CompiledJavaVersionBuildItem compiledJavaVersion,
61-
Optional<AppCDSContainerImageBuildItem> appCDSContainerImage,
62-
BuildProducer<AppCDSResultBuildItem> appCDS,
62+
Optional<JvmStartupOptimizerArchiveContainerImageBuildItem> jvmStartupOptimizerArchiveContainerImage,
63+
BuildProducer<JvmStartupOptimizerArchiveResultBuildItem> jvmStartupOptimizerArchive,
6364
BuildProducer<ArtifactResultBuildItem> artifactResult) throws Exception {
6465
if (requested.isEmpty()) {
6566
return;
6667
}
6768

6869
// to actually execute the commands needed to generate the AppCDS file, either the JVM in the container image will be used
6970
// (if specified), or the JVM running the build
70-
String containerImage = determineContainerImage(packageConfig, appCDSContainerImage);
71+
String containerImage = determineContainerImage(packageConfig, jvmStartupOptimizerArchiveContainerImage);
7172
String javaBinPath = null;
7273
if (containerImage == null) {
7374
javaBinPath = System.getProperty("java.home") + File.separator + "bin" + File.separator
@@ -117,18 +118,18 @@ public void build(Optional<AppCDSRequestedBuildItem> requested,
117118
}
118119
}
119120

120-
appCDS.produce(new AppCDSResultBuildItem(archivePath));
121+
jvmStartupOptimizerArchive.produce(new JvmStartupOptimizerArchiveResultBuildItem(archivePath));
121122
artifactResult.produce(new ArtifactResultBuildItem(archivePath, "appCDS", Collections.emptyMap()));
122123
}
123124

124125
private String determineContainerImage(PackageConfig packageConfig,
125-
Optional<AppCDSContainerImageBuildItem> appCDSContainerImage) {
126+
Optional<JvmStartupOptimizerArchiveContainerImageBuildItem> jvmStartupOptimizerArchiveContainer) {
126127
if (!packageConfig.jar().appcds().useContainer()) {
127128
return null;
128129
} else if (packageConfig.jar().appcds().builderImage().isPresent()) {
129130
return packageConfig.jar().appcds().builderImage().get();
130-
} else if (appCDSContainerImage.isPresent()) {
131-
return appCDSContainerImage.get().getContainerImage();
131+
} else if (jvmStartupOptimizerArchiveContainer.isPresent()) {
132+
return jvmStartupOptimizerArchiveContainer.get().getContainerImage();
132133
}
133134
return null;
134135
}

core/deployment/src/main/java/io/quarkus/deployment/steps/MainClassBuildStep.java

-22
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@
6161
import io.quarkus.deployment.configuration.RunTimeConfigurationGenerator;
6262
import io.quarkus.deployment.naming.NamingConfig;
6363
import io.quarkus.deployment.pkg.PackageConfig;
64-
import io.quarkus.deployment.pkg.builditem.AppCDSControlPointBuildItem;
65-
import io.quarkus.deployment.pkg.builditem.AppCDSRequestedBuildItem;
6664
import io.quarkus.deployment.recording.BytecodeRecorderImpl;
6765
import io.quarkus.dev.appstate.ApplicationStateNotification;
6866
import io.quarkus.dev.console.QuarkusConsole;
@@ -77,7 +75,6 @@
7775
import io.quarkus.gizmo.ResultHandle;
7876
import io.quarkus.gizmo.TryBlock;
7977
import io.quarkus.runtime.Application;
80-
import io.quarkus.runtime.ApplicationLifecycleManager;
8178
import io.quarkus.runtime.ExecutionModeManager;
8279
import io.quarkus.runtime.LaunchMode;
8380
import io.quarkus.runtime.NativeImageRuntimePropertiesRecorder;
@@ -87,7 +84,6 @@
8784
import io.quarkus.runtime.StartupContext;
8885
import io.quarkus.runtime.StartupTask;
8986
import io.quarkus.runtime.annotations.QuarkusMain;
90-
import io.quarkus.runtime.appcds.AppCDSUtil;
9187
import io.quarkus.runtime.configuration.ConfigUtils;
9288
import io.quarkus.runtime.util.StepTiming;
9389

@@ -140,8 +136,6 @@ void build(List<StaticBytecodeRecorderBuildItem> staticInitTasks,
140136
LiveReloadBuildItem liveReloadBuildItem,
141137
ApplicationInfoBuildItem applicationInfo,
142138
List<AllowJNDIBuildItem> allowJNDIBuildItems,
143-
Optional<AppCDSRequestedBuildItem> appCDSRequested,
144-
Optional<AppCDSControlPointBuildItem> appCDSControlPoint,
145139
NamingConfig namingConfig) {
146140

147141
appClassNameProducer.produce(new ApplicationClassNameBuildItem(Application.APP_CLASS_NAME));
@@ -224,22 +218,6 @@ void build(List<StaticBytecodeRecorderBuildItem> staticInitTasks,
224218
mv = file.getMethodCreator("doStart", void.class, String[].class);
225219
mv.setModifiers(Modifier.PROTECTED | Modifier.FINAL);
226220

227-
// if AppCDS generation was requested and no other code has requested handling of the process,
228-
// we ensure that the application simply loads some classes from a file and terminates
229-
if (appCDSRequested.isPresent() && appCDSControlPoint.isEmpty()) {
230-
ResultHandle createAppCDsSysProp = mv.invokeStaticMethod(
231-
ofMethod(System.class, "getProperty", String.class, String.class, String.class),
232-
mv.load(GENERATE_APP_CDS_SYSTEM_PROPERTY), mv.load("false"));
233-
ResultHandle createAppCDSBool = mv.invokeStaticMethod(
234-
ofMethod(Boolean.class, "parseBoolean", boolean.class, String.class), createAppCDsSysProp);
235-
BytecodeCreator createAppCDS = mv.ifTrue(createAppCDSBool).trueBranch();
236-
237-
createAppCDS.invokeStaticMethod(ofMethod(AppCDSUtil.class, "loadGeneratedClasses", void.class));
238-
239-
createAppCDS.invokeStaticMethod(ofMethod(ApplicationLifecycleManager.class, "exit", void.class));
240-
createAppCDS.returnValue(null);
241-
}
242-
243221
// Make sure we set properties in doStartup as well. This is necessary because setting them in the static-init
244222
// sets them at build-time, on the host JVM, while SVM has substitutions for System. get/ setProperty at
245223
// run-time which will never see those properties unless we also set them at run-time.

core/runtime/src/main/java/io/quarkus/runtime/appcds/AppCDSUtil.java

-28
This file was deleted.

0 commit comments

Comments
 (0)