Skip to content

Commit d9c099f

Browse files
committed
Allow quarkus:run to launch DevServices
Closes: quarkusio#40270
1 parent a056ad5 commit d9c099f

File tree

5 files changed

+103
-11
lines changed

5 files changed

+103
-11
lines changed

core/deployment/src/main/java/io/quarkus/deployment/cmd/RunCommandProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void defaultJavaCommand(PackageConfig packageConfig,
5252
List<String> args = new ArrayList<>();
5353
args.add(determineJavaPath());
5454

55-
for (Map.Entry<?, ?> e : System.getProperties().entrySet()) {
55+
for (Map.Entry<?, ?> e : System.getProperties().entrySet()) { //TODO: this is almost certainly wrong as it pulls in all the system properties Maven has set
5656
args.add("-D" + e.getKey().toString() + "=" + e.getValue().toString());
5757
}
5858
args.add("-jar");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package io.quarkus.deployment.cmd;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.function.BiConsumer;
8+
import java.util.function.Consumer;
9+
10+
import io.quarkus.builder.BuildResult;
11+
import io.quarkus.deployment.builditem.DevServicesLauncherConfigResultBuildItem;
12+
13+
public class StartDevServicesAndRunCommandHandler implements BiConsumer<Object, BuildResult> {
14+
15+
@Override
16+
public void accept(Object o, BuildResult buildResult) {
17+
var runCommandActionResult = buildResult.consume(RunCommandActionResultBuildItem.class);
18+
var devServicesLauncherConfigResult = buildResult.consume(DevServicesLauncherConfigResultBuildItem.class);
19+
20+
// FYI: AugmentAction.performCustomBuild runs in its own classloader
21+
// so we can only pass back instances of those classes in the system classloader
22+
23+
Consumer<Map<String, List>> consumer = (Consumer<Map<String, List>>) o;
24+
25+
// build up the commands
26+
Map<String, List> cmds = new HashMap<>();
27+
for (RunCommandActionBuildItem item : runCommandActionResult.getCommands()) {
28+
List<String> itemList = new ArrayList<>();
29+
addLaunchCommand(itemList, item, devServicesLauncherConfigResult.getConfig());
30+
cmds.put(item.getCommandName(), itemList);
31+
}
32+
33+
consumer.accept(cmds);
34+
}
35+
36+
private void addLaunchCommand(List list, RunCommandActionBuildItem item, Map<String, String> devServicesProperties) {
37+
List<String> effectiveArgs;
38+
List<String> originalArgs = item.getArgs();
39+
if (devServicesProperties.isEmpty()) {
40+
effectiveArgs = originalArgs;
41+
} else {
42+
effectiveArgs = new ArrayList<>(originalArgs.size() + devServicesProperties.size());
43+
int jarArgIndex = 0;
44+
for (int i = 0; i < originalArgs.size(); i++) {
45+
if (originalArgs.get(i).trim().equals("-jar")) {
46+
jarArgIndex = i;
47+
break;
48+
}
49+
}
50+
effectiveArgs.addAll(originalArgs.subList(0, jarArgIndex));
51+
for (var devServiceConfigEntry : devServicesProperties.entrySet()) {
52+
effectiveArgs.add("-D" + devServiceConfigEntry.getKey() + "=" + devServiceConfigEntry.getValue());
53+
}
54+
effectiveArgs.addAll(originalArgs.subList(jarArgIndex, originalArgs.size()));
55+
}
56+
57+
list.add(effectiveArgs);
58+
list.add(item.getWorkingDirectory());
59+
list.add(item.getStartedExpression());
60+
list.add(item.isNeedsLogfile());
61+
list.add(item.getLogFile());
62+
}
63+
}

devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapMojo.java

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Map;
99
import java.util.Optional;
1010
import java.util.Properties;
11+
import java.util.function.Consumer;
1112
import java.util.stream.Stream;
1213

1314
import org.apache.maven.AbstractMavenLifecycleParticipant;
@@ -26,6 +27,7 @@
2627
import org.eclipse.aether.repository.RemoteRepository;
2728

2829
import io.quarkus.bootstrap.app.CuratedApplication;
30+
import io.quarkus.bootstrap.app.QuarkusBootstrap;
2931
import io.quarkus.maven.components.BootstrapSessionListener;
3032
import io.quarkus.maven.components.ManifestSection;
3133
import io.quarkus.maven.dependency.ArtifactKey;
@@ -294,6 +296,11 @@ protected CuratedApplication bootstrapApplication(LaunchMode mode) throws MojoEx
294296
return bootstrapProvider.bootstrapApplication(this, mode);
295297
}
296298

299+
protected CuratedApplication bootstrapApplication(LaunchMode mode, Consumer<QuarkusBootstrap.Builder> builderCustomizer)
300+
throws MojoExecutionException {
301+
return bootstrapProvider.bootstrapApplication(this, mode, builderCustomizer);
302+
}
303+
297304
protected Properties getBuildSystemProperties(boolean quarkusOnly) throws MojoExecutionException {
298305
return bootstrapProvider.bootstrapper(this).getBuildSystemProperties(this, quarkusOnly);
299306
}

devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java

+18-6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Properties;
1515
import java.util.Set;
1616
import java.util.concurrent.ExecutionException;
17+
import java.util.function.Consumer;
1718

1819
import javax.inject.Inject;
1920
import javax.inject.Named;
@@ -126,7 +127,13 @@ public QuarkusMavenAppBootstrap bootstrapper(QuarkusBootstrapMojo mojo) {
126127

127128
public CuratedApplication bootstrapApplication(QuarkusBootstrapMojo mojo, LaunchMode mode)
128129
throws MojoExecutionException {
129-
return bootstrapper(mojo).bootstrapApplication(mojo, mode);
130+
return bootstrapApplication(mojo, mode, null);
131+
}
132+
133+
public CuratedApplication bootstrapApplication(QuarkusBootstrapMojo mojo, LaunchMode mode,
134+
Consumer<QuarkusBootstrap.Builder> builderCustomizer)
135+
throws MojoExecutionException {
136+
return bootstrapper(mojo).bootstrapApplication(mojo, mode, builderCustomizer);
130137
}
131138

132139
public ApplicationModel getResolvedApplicationModel(ArtifactKey projectId, LaunchMode mode, String bootstrapId) {
@@ -203,7 +210,8 @@ private MavenArtifactResolver artifactResolver(QuarkusBootstrapMojo mojo, Launch
203210
}
204211
}
205212

206-
private CuratedApplication doBootstrap(QuarkusBootstrapMojo mojo, LaunchMode mode)
213+
private CuratedApplication doBootstrap(QuarkusBootstrapMojo mojo, LaunchMode mode,
214+
Consumer<QuarkusBootstrap.Builder> builderCustomizer)
207215
throws MojoExecutionException {
208216

209217
final BootstrapAppModelResolver modelResolver = new BootstrapAppModelResolver(artifactResolver(mojo, mode))
@@ -253,6 +261,9 @@ private CuratedApplication doBootstrap(QuarkusBootstrapMojo mojo, LaunchMode mod
253261
.setForcedDependencies(forcedDependencies);
254262

255263
try {
264+
if (builderCustomizer != null) {
265+
builderCustomizer.accept(builder);
266+
}
256267
return builder.build().bootstrap();
257268
} catch (BootstrapException e) {
258269
throw new MojoExecutionException("Failed to bootstrap the application", e);
@@ -346,15 +357,16 @@ private String toManifestSectionAttributeKey(String section, String key) throws
346357
key);
347358
}
348359

349-
protected CuratedApplication bootstrapApplication(QuarkusBootstrapMojo mojo, LaunchMode mode)
360+
protected CuratedApplication bootstrapApplication(QuarkusBootstrapMojo mojo, LaunchMode mode,
361+
Consumer<QuarkusBootstrap.Builder> builderCustomizer)
350362
throws MojoExecutionException {
351363
if (mode == LaunchMode.DEVELOPMENT) {
352-
return devApp == null ? devApp = doBootstrap(mojo, mode) : devApp;
364+
return devApp == null ? devApp = doBootstrap(mojo, mode, builderCustomizer) : devApp;
353365
}
354366
if (mode == LaunchMode.TEST) {
355-
return testApp == null ? testApp = doBootstrap(mojo, mode) : testApp;
367+
return testApp == null ? testApp = doBootstrap(mojo, mode, builderCustomizer) : testApp;
356368
}
357-
return prodApp == null ? prodApp = doBootstrap(mojo, mode) : prodApp;
369+
return prodApp == null ? prodApp = doBootstrap(mojo, mode, builderCustomizer) : prodApp;
358370
}
359371

360372
protected ArtifactCoords managingProject(QuarkusBootstrapMojo mojo) {

devtools/maven/src/main/java/io/quarkus/maven/RunMojo.java

+14-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717

1818
import io.quarkus.bootstrap.app.AugmentAction;
1919
import io.quarkus.bootstrap.app.CuratedApplication;
20+
import io.quarkus.bootstrap.app.QuarkusBootstrap;
21+
import io.quarkus.deployment.builditem.DevServicesLauncherConfigResultBuildItem;
2022
import io.quarkus.deployment.cmd.RunCommandActionResultBuildItem;
21-
import io.quarkus.deployment.cmd.RunCommandHandler;
23+
import io.quarkus.deployment.cmd.StartDevServicesAndRunCommandHandler;
24+
import io.quarkus.runtime.LaunchMode;
2225

2326
@Mojo(name = "run")
2427
public class RunMojo extends QuarkusBootstrapMojo {
@@ -47,12 +50,19 @@ protected void doExecute() throws MojoExecutionException, MojoFailureException {
4750
}
4851
}
4952

50-
try (CuratedApplication curatedApplication = bootstrapApplication()) {
53+
try (CuratedApplication curatedApplication = bootstrapApplication(LaunchMode.NORMAL,
54+
new Consumer<QuarkusBootstrap.Builder>() {
55+
@Override
56+
public void accept(QuarkusBootstrap.Builder builder) {
57+
// we need this for dev services
58+
builder.setMode(QuarkusBootstrap.Mode.TEST);
59+
}
60+
})) {
5161
AugmentAction action = curatedApplication.createAugmentor();
5262
AtomicReference<Boolean> exists = new AtomicReference<>();
5363
AtomicReference<String> tooMany = new AtomicReference<>();
5464
String target = System.getProperty("quarkus.run.target");
55-
action.performCustomBuild(RunCommandHandler.class.getName(), new Consumer<Map<String, List>>() {
65+
action.performCustomBuild(StartDevServicesAndRunCommandHandler.class.getName(), new Consumer<Map<String, List>>() {
5666
@Override
5767
public void accept(Map<String, List> cmds) {
5868
List cmd = null;
@@ -94,7 +104,7 @@ public void accept(Map<String, List> cmds) {
94104
}
95105
}
96106
},
97-
RunCommandActionResultBuildItem.class.getName());
107+
RunCommandActionResultBuildItem.class.getName(), DevServicesLauncherConfigResultBuildItem.class.getName());
98108
if (target != null && !exists.get()) {
99109
getLog().error("quarkus.run.target " + target + " is not found");
100110
return;

0 commit comments

Comments
 (0)