diff --git a/core/deployment/src/main/java/io/quarkus/deployment/pkg/PackageConfig.java b/core/deployment/src/main/java/io/quarkus/deployment/pkg/PackageConfig.java index 205c0be2ab3bf..e5918d4cd3df6 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/pkg/PackageConfig.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/pkg/PackageConfig.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Optional; +import java.util.Set; import io.quarkus.runtime.annotations.ConfigGroup; import io.quarkus.runtime.annotations.ConfigItem; @@ -56,6 +57,37 @@ public class PackageConfig { @ConfigItem public Optional> userConfiguredIgnoredEntries; + /** + * List of all the dependencies that have been defined as optional to include into the final package of the application. + * Each optional dependency needs to be expressed in the following format: + *

+ * groupId:artifactId:classifier:type + *

+ * With the classifier and type being optional. + *

+ * If the type is missing, the artifact is assumed to be of type {@code jar}. + *

+ * This parameter is optional, if absent, no optional dependencies will be included into the final package of + * the application. + *

+ * For backward compatibility reasons, this parameter is ignored by default and can be enabled by setting the + * parameter {@code quarkus.package.filter-optional-dependencies} to {@code true}. + *

+ * This parameter is meant to be used in modules where multi-builds have been configured to avoid getting a final + * package with unused dependencies. + */ + @ConfigItem + public Optional> includedOptionalDependencies; + + /** + * Flag indicating whether the optional dependencies should be filtered out or not. + *

+ * This parameter is meant to be used in modules where multi-builds have been configured to avoid getting a final + * package with unused dependencies. + */ + @ConfigItem(defaultValue = "false") + public boolean filterOptionalDependencies; + /** * The suffix that is applied to the runner jar and native images */ diff --git a/core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/OutputTargetBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/OutputTargetBuildItem.java index 11362565c36d1..0bbef34685cf4 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/OutputTargetBuildItem.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/pkg/builditem/OutputTargetBuildItem.java @@ -1,8 +1,11 @@ package io.quarkus.deployment.pkg.builditem; import java.nio.file.Path; +import java.util.Optional; import java.util.Properties; +import java.util.Set; +import io.quarkus.bootstrap.model.AppArtifactKey; import io.quarkus.builder.item.SimpleBuildItem; /** @@ -16,12 +19,15 @@ public final class OutputTargetBuildItem extends SimpleBuildItem { private final String baseName; private final boolean rebuild; private final Properties buildSystemProperties; + private final Optional> includedOptionalDependencies; - public OutputTargetBuildItem(Path outputDirectory, String baseName, boolean rebuild, Properties buildSystemProperties) { + public OutputTargetBuildItem(Path outputDirectory, String baseName, boolean rebuild, Properties buildSystemProperties, + Optional> includedOptionalDependencies) { this.outputDirectory = outputDirectory; this.baseName = baseName; this.rebuild = rebuild; this.buildSystemProperties = buildSystemProperties; + this.includedOptionalDependencies = includedOptionalDependencies; } public Path getOutputDirectory() { @@ -39,4 +45,8 @@ public boolean isRebuild() { public Properties getBuildSystemProperties() { return buildSystemProperties; } + + public Optional> getIncludedOptionalDependencies() { + return includedOptionalDependencies; + } } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/JarResultBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/JarResultBuildStep.java index 928ed20fe236a..ea1637face896 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/JarResultBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/JarResultBuildStep.java @@ -52,12 +52,10 @@ import org.apache.commons.lang3.SystemUtils; import org.jboss.logging.Logger; -import io.quarkus.bootstrap.BootstrapDependencyProcessingException; import io.quarkus.bootstrap.model.AppArtifact; import io.quarkus.bootstrap.model.AppArtifactKey; import io.quarkus.bootstrap.model.AppDependency; import io.quarkus.bootstrap.model.PersistentAppModel; -import io.quarkus.bootstrap.resolver.AppModelResolverException; import io.quarkus.bootstrap.runner.QuarkusEntryPoint; import io.quarkus.bootstrap.runner.SerializedApplication; import io.quarkus.bootstrap.util.IoUtils; @@ -155,7 +153,15 @@ OutputTargetBuildItem outputTarget(BuildSystemTargetBuildItem bst, PackageConfig String name = packageConfig.outputName.orElseGet(bst::getBaseName); Path path = packageConfig.outputDirectory.map(s -> bst.getOutputDirectory().resolve(s)) .orElseGet(bst::getOutputDirectory); - return new OutputTargetBuildItem(path, name, bst.isRebuild(), bst.getBuildSystemProps()); + Optional> includedOptionalDependencies; + if (packageConfig.filterOptionalDependencies) { + includedOptionalDependencies = Optional.of(packageConfig.includedOptionalDependencies + .map(set -> set.stream().map(AppArtifactKey::fromString).collect(Collectors.toSet())) + .orElse(Collections.emptySet())); + } else { + includedOptionalDependencies = Optional.empty(); + } + return new OutputTargetBuildItem(path, name, bst.isRebuild(), bst.getBuildSystemProps(), includedOptionalDependencies); } @BuildStep(onlyIf = JarRequired.class) @@ -195,8 +201,7 @@ public JarBuildItem buildRunnerJar(CurateOutcomeBuildItem curateOutcomeBuildItem if (legacyJarRequired.isEmpty() && (!uberJarRequired.isEmpty() || packageConfig.type.equalsIgnoreCase(PackageConfig.UBER_JAR))) { return buildUberJar(curateOutcomeBuildItem, outputTargetBuildItem, transformedClasses, applicationArchivesBuildItem, - packageConfig, applicationInfo, generatedClasses, generatedResources, closeablesBuildItem, - mainClassBuildItem); + packageConfig, applicationInfo, generatedClasses, generatedResources, mainClassBuildItem); } else if (!legacyJarRequired.isEmpty() || packageConfig.isLegacyJar() || packageConfig.type.equalsIgnoreCase(PackageConfig.LEGACY)) { return buildLegacyThinJar(curateOutcomeBuildItem, outputTargetBuildItem, transformedClasses, @@ -243,7 +248,6 @@ private JarBuildItem buildUberJar(CurateOutcomeBuildItem curateOutcomeBuildItem, ApplicationInfoBuildItem applicationInfo, List generatedClasses, List generatedResources, - QuarkusBuildCloseablesBuildItem closeablesBuildItem, MainClassBuildItem mainClassBuildItem) throws Exception { //we use the -runner jar name, unless we are building both types @@ -252,6 +256,7 @@ private JarBuildItem buildUberJar(CurateOutcomeBuildItem curateOutcomeBuildItem, Files.deleteIfExists(runnerJar); buildUberJar0(curateOutcomeBuildItem, + outputTargetBuildItem, transformedClasses, applicationArchivesBuildItem, packageConfig, @@ -276,6 +281,7 @@ private String suffixToClassifier(String suffix) { } private void buildUberJar0(CurateOutcomeBuildItem curateOutcomeBuildItem, + OutputTargetBuildItem outputTargetBuildItem, TransformedClassesBuildItem transformedClasses, ApplicationArchivesBuildItem applicationArchivesBuildItem, PackageConfig packageConfig, @@ -306,7 +312,8 @@ private void buildUberJar0(CurateOutcomeBuildItem curateOutcomeBuildItem, final AppArtifact depArtifact = appDep.getArtifact(); // Exclude files that are not jars (typically, we can have XML files here, see https://github.com/quarkusio/quarkus/issues/2852) - if (!isAppDepAJar(depArtifact)) { + // and are not part of the optional dependencies to include + if (!includeAppDep(appDep, outputTargetBuildItem.getIncludedOptionalDependencies())) { continue; } @@ -342,8 +349,30 @@ private void buildUberJar0(CurateOutcomeBuildItem curateOutcomeBuildItem, runnerJar.toFile().setReadable(true, false); } - private boolean isAppDepAJar(AppArtifact artifact) { - return "jar".equals(artifact.getType()); + /** + * Indicates whether the given dependency should be included or not. + *

+ * A dependency should be included if it is a jar file and: + *

+ *

+ * + * @param appDep the dependency to test. + * @param optionalDependencies the optional dependencies to include into the final package. + * @return {@code true} if the dependency should be included, {@code false} otherwise. + */ + private static boolean includeAppDep(AppDependency appDep, Optional> optionalDependencies) { + if (!"jar".equals(appDep.getArtifact().getType())) { + return false; + } + if (appDep.isOptional()) { + return optionalDependencies.map(appArtifactKeys -> appArtifactKeys.contains(appDep.getArtifact().getKey())) + .orElse(true); + } + return true; } private void walkFileDependencyForDependency(Path root, FileSystem runnerZipFs, Map seen, @@ -424,7 +453,8 @@ private JarBuildItem buildLegacyThinJar(CurateOutcomeBuildItem curateOutcomeBuil log.info("Building thin jar: " + runnerJar); - doLegacyThinJarGeneration(curateOutcomeBuildItem, transformedClasses, applicationArchivesBuildItem, applicationInfo, + doLegacyThinJarGeneration(curateOutcomeBuildItem, outputTargetBuildItem, transformedClasses, + applicationArchivesBuildItem, applicationInfo, packageConfig, generatedResources, libDir, generatedClasses, runnerZipFs, mainClassBuildItem); } runnerJar.toFile().setReadable(true, false); @@ -576,7 +606,8 @@ private JarBuildItem buildThinJar(CurateOutcomeBuildItem curateOutcomeBuildItem, if (rebuild) { jars.addAll(appDep.getArtifact().getPaths().toList()); } else { - copyDependency(curateOutcomeBuildItem, copiedArtifacts, mainLib, baseLib, jars, true, classPath, appDep); + copyDependency(curateOutcomeBuildItem, outputTargetBuildItem, copiedArtifacts, mainLib, baseLib, jars, true, + classPath, appDep); } if (curateOutcomeBuildItem.getEffectiveModel().getRunnerParentFirstArtifacts() .contains(appDep.getArtifact().getKey())) { @@ -631,7 +662,8 @@ private JarBuildItem buildThinJar(CurateOutcomeBuildItem curateOutcomeBuildItem, Path deploymentLib = libDir.resolve(DEPLOYMENT_LIB); Files.createDirectories(deploymentLib); for (AppDependency appDep : curateOutcomeBuildItem.getEffectiveModel().getFullDeploymentDeps()) { - copyDependency(curateOutcomeBuildItem, copiedArtifacts, deploymentLib, baseLib, jars, false, classPath, + copyDependency(curateOutcomeBuildItem, outputTargetBuildItem, copiedArtifacts, deploymentLib, baseLib, jars, + false, classPath, appDep); } @@ -753,13 +785,15 @@ private boolean decompile(Path fernflowerJar, Path decompiledOutputDir, Path jar return true; } - private void copyDependency(CurateOutcomeBuildItem curateOutcomeBuildItem, Map> runtimeArtifacts, - Path libDir, Path baseLib, List jars, boolean allowParentFirst, StringBuilder classPath, AppDependency appDep) + private void copyDependency(CurateOutcomeBuildItem curateOutcomeBuildItem, OutputTargetBuildItem outputTargetBuildItem, + Map> runtimeArtifacts, Path libDir, Path baseLib, List jars, + boolean allowParentFirst, StringBuilder classPath, AppDependency appDep) throws IOException { final AppArtifact depArtifact = appDep.getArtifact(); // Exclude files that are not jars (typically, we can have XML files here, see https://github.com/quarkusio/quarkus/issues/2852) - if (!isAppDepAJar(depArtifact)) { + // and are not part of the optional dependencies to include + if (!includeAppDep(appDep, outputTargetBuildItem.getIncludedOptionalDependencies())) { return; } if (runtimeArtifacts.containsKey(depArtifact.getKey())) { @@ -876,8 +910,9 @@ private NativeImageSourceJarBuildItem buildNativeImageThinJar(CurateOutcomeBuild log.info("Building native image source jar: " + runnerJar); - doLegacyThinJarGeneration(curateOutcomeBuildItem, transformedClasses, applicationArchivesBuildItem, applicationInfo, - packageConfig, generatedResources, libDir, allClasses, runnerZipFs, mainClassBuildItem); + doLegacyThinJarGeneration(curateOutcomeBuildItem, outputTargetBuildItem, transformedClasses, + applicationArchivesBuildItem, applicationInfo, packageConfig, generatedResources, libDir, allClasses, + runnerZipFs, mainClassBuildItem); } runnerJar.toFile().setReadable(true, false); return new NativeImageSourceJarBuildItem(runnerJar, libDir); @@ -898,6 +933,7 @@ private NativeImageSourceJarBuildItem buildNativeImageUberJar(CurateOutcomeBuild .resolve(outputTargetBuildItem.getBaseName() + packageConfig.runnerSuffix + ".jar"); buildUberJar0(curateOutcomeBuildItem, + outputTargetBuildItem, transformedClasses, applicationArchivesBuildItem, packageConfig, @@ -937,6 +973,7 @@ public void accept(Path jsonPath) { } private void doLegacyThinJarGeneration(CurateOutcomeBuildItem curateOutcomeBuildItem, + OutputTargetBuildItem outputTargetBuildItem, TransformedClassesBuildItem transformedClasses, ApplicationArchivesBuildItem applicationArchivesBuildItem, ApplicationInfoBuildItem applicationInfo, @@ -946,7 +983,7 @@ private void doLegacyThinJarGeneration(CurateOutcomeBuildItem curateOutcomeBuild List allClasses, FileSystem runnerZipFs, MainClassBuildItem mainClassBuildItem) - throws BootstrapDependencyProcessingException, AppModelResolverException, IOException { + throws IOException { final Map seen = new HashMap<>(); final StringBuilder classPath = new StringBuilder(); final Map> services = new HashMap<>(); @@ -955,7 +992,8 @@ private void doLegacyThinJarGeneration(CurateOutcomeBuildItem curateOutcomeBuild final Set finalIgnoredEntries = new HashSet<>(IGNORED_ENTRIES); packageConfig.userConfiguredIgnoredEntries.ifPresent(finalIgnoredEntries::addAll); - copyLibraryJars(runnerZipFs, transformedClasses, libDir, classPath, appDeps, services, finalIgnoredEntries); + copyLibraryJars(runnerZipFs, outputTargetBuildItem, transformedClasses, libDir, classPath, appDeps, services, + finalIgnoredEntries); AppArtifact appArtifact = curateOutcomeBuildItem.getEffectiveModel().getAppArtifact(); // the manifest needs to be the first entry in the jar, otherwise JarInputStream does not work properly @@ -967,7 +1005,8 @@ private void doLegacyThinJarGeneration(CurateOutcomeBuildItem curateOutcomeBuild generatedResources, seen, finalIgnoredEntries); } - private void copyLibraryJars(FileSystem runnerZipFs, TransformedClassesBuildItem transformedClasses, Path libDir, + private void copyLibraryJars(FileSystem runnerZipFs, OutputTargetBuildItem outputTargetBuildItem, + TransformedClassesBuildItem transformedClasses, Path libDir, StringBuilder classPath, List appDeps, Map> services, Set ignoredEntries) throws IOException { @@ -975,7 +1014,8 @@ private void copyLibraryJars(FileSystem runnerZipFs, TransformedClassesBuildItem final AppArtifact depArtifact = appDep.getArtifact(); // Exclude files that are not jars (typically, we can have XML files here, see https://github.com/quarkusio/quarkus/issues/2852) - if (!isAppDepAJar(depArtifact)) { + // and are not part of the optional dependencies to include + if (!includeAppDep(appDep, outputTargetBuildItem.getIncludedOptionalDependencies())) { continue; } diff --git a/integration-tests/maven/src/test/java/io/quarkus/maven/it/BuildIT.java b/integration-tests/maven/src/test/java/io/quarkus/maven/it/BuildIT.java index b3c9ce3c959e2..38e91a8eaaca5 100644 --- a/integration-tests/maven/src/test/java/io/quarkus/maven/it/BuildIT.java +++ b/integration-tests/maven/src/test/java/io/quarkus/maven/it/BuildIT.java @@ -91,20 +91,29 @@ void testMultiBuildMode() throws MavenInvocationException, InterruptedException, testDir = initProject("projects/multi-build-mode"); build(null); - launch("foo-", "Foo: hello, from foo"); - launch("bar-", "Bar: hello, from bar"); + for (TestContext context : TestContext.values()) { + if (context == TestContext.FAST_NO_PREFIX) { + continue; + } + launch(context, "foo-", "Foo: hello, from foo-?/MultiSet"); + launch(context, "bar-", "Bar: hello, from bar-FileUtils/?"); + launch(context, "foo-full-", "Foo: hello, from foo-FileUtils/MultiSet"); + launch(context, "bar-empty-", "Bar: hello, from bar-?/?"); + } } private void launch() throws IOException { - launch("", "hello, from foo"); + launch(TestContext.FAST_NO_PREFIX, "", "hello, from foo"); } - private void launch(String outputPrefix, String expectedMessage) throws IOException { - File output = new File(testDir, String.format("target/%soutput.log", outputPrefix)); + private void launch(TestContext context, String outputPrefix, String expectedMessage) throws IOException { + File output = new File(testDir, String.format("target/%s%soutput.log", context.prefix, outputPrefix)); output.createNewFile(); - Process process = JarRunnerIT.doLaunch(new File(testDir, String.format("target/%squarkus-app", outputPrefix)), - Paths.get("quarkus-run.jar"), output, - Collections.emptyList()).start(); + Process process = JarRunnerIT + .doLaunch(new File(testDir, String.format("target/%s%squarkus-app", context.prefix, outputPrefix)), + Paths.get(context.jarFileName), output, + Collections.emptyList()) + .start(); try { Assertions.assertEquals(expectedMessage, DevModeTestUtils.getHttpResponse("/hello")); } finally { @@ -133,4 +142,19 @@ private void ensureManifestOfJarIsReadableByJarInputStream(File jar) throws IOEx } } } + + enum TestContext { + FAST_NO_PREFIX("", "quarkus-run.jar"), + FAST("fast-", "quarkus-run.jar"), + LEGACY("legacy-", "legacy-runner.jar"), + UBER("uber-", "uber-runner.jar"); + + final String prefix; + final String jarFileName; + + TestContext(String prefix, String jarFileName) { + this.prefix = prefix; + this.jarFileName = jarFileName; + } + } } diff --git a/integration-tests/maven/src/test/resources/projects/multi-build-mode/pom.xml b/integration-tests/maven/src/test/resources/projects/multi-build-mode/pom.xml index 5ac9c84b005e6..cac237b8edb31 100644 --- a/integration-tests/maven/src/test/resources/projects/multi-build-mode/pom.xml +++ b/integration-tests/maven/src/test/resources/projects/multi-build-mode/pom.xml @@ -14,6 +14,8 @@ UTF-8 1.8 3.0.0-M5 + 4.4 + 1.3.2 @@ -43,6 +45,18 @@ rest-assured test + + org.apache.commons + commons-collections4 + ${commons.collections.version} + true + + + commons-io + commons-io + ${commons.io.version} + true + @@ -53,7 +67,197 @@ true - build-foo + fast-build-foo + + generate-code + generate-code-tests + build + + + + fast-foo-quarkus-app + true + org.apache.commons:commons-collections4::jar + + + foo + + + + + fast-build-bar + + generate-code + generate-code-tests + build + + + + fast-bar-quarkus-app + true + commons-io:commons-io:: + + + bar + + + + + fast-build-foo-full + + generate-code + generate-code-tests + build + + + + fast-foo-full-quarkus-app + true + org.apache.commons:commons-collections4::jar,commons-io:commons-io:: + + + foo + + + + + fast-build-bar-empty + + generate-code + generate-code-tests + build + + + + fast-bar-empty-quarkus-app + true + + + bar + + + + + legacy-build-foo + + generate-code + generate-code-tests + build + + + + legacy + legacy-jar + legacy-foo-quarkus-app + true + org.apache.commons:commons-collections4::jar + + + foo + + + + + legacy-build-bar + + generate-code + generate-code-tests + build + + + + legacy + legacy-jar + legacy-bar-quarkus-app + true + commons-io:commons-io:: + + + bar + + + + + legacy-build-foo-full + + generate-code + generate-code-tests + build + + + + legacy + legacy-jar + legacy-foo-full-quarkus-app + true + org.apache.commons:commons-collections4::jar,commons-io:commons-io:: + + + foo + + + + + legacy-build-bar-empty + + generate-code + generate-code-tests + build + + + + legacy + legacy-jar + legacy-bar-empty-quarkus-app + true + + + bar + + + + + uber-build-foo + + generate-code + generate-code-tests + build + + + + uber + uber-jar + uber-foo-quarkus-app + true + org.apache.commons:commons-collections4::jar + + + foo + + + + + uber-build-bar + + generate-code + generate-code-tests + build + + + + uber + uber-jar + uber-bar-quarkus-app + true + commons-io:commons-io:: + + + bar + + + + + uber-build-foo-full generate-code generate-code-tests @@ -61,7 +265,11 @@ - foo-quarkus-app + uber + uber-jar + uber-foo-full-quarkus-app + true + org.apache.commons:commons-collections4::jar,commons-io:commons-io:: foo @@ -69,7 +277,7 @@ - build-bar + uber-build-bar-empty generate-code generate-code-tests @@ -77,7 +285,10 @@ - bar-quarkus-app + uber + uber-jar + uber-bar-empty-quarkus-app + true bar diff --git a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceBar.java b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceBar.java index 6aaebb0c0475a..7c2e4cc6fa3b4 100644 --- a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceBar.java +++ b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceBar.java @@ -18,6 +18,6 @@ public class HelloResourceBar { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { - return "Bar: hello, " + service.name(); + return "Bar: hello, " + service.name() + "-" + service.classFounds(); } } diff --git a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceFoo.java b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceFoo.java index 32373f399243d..99c5708a8edb1 100644 --- a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceFoo.java +++ b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloResourceFoo.java @@ -18,6 +18,6 @@ public class HelloResourceFoo { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { - return "Foo: hello, " + service.name(); + return "Foo: hello, " + service.name() + "-" + service.classFounds(); } } diff --git a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloService.java b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloService.java index 470ae78ea8a16..e9c9cf9b1ab1d 100644 --- a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloService.java +++ b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/main/java/org/acme/HelloService.java @@ -3,10 +3,28 @@ import io.quarkus.arc.profile.IfBuildProfile; import javax.enterprise.context.ApplicationScoped; +import org.apache.commons.io.FileUtils; +import org.apache.commons.collections4.MultiSet; public interface HelloService { String name(); + default String classFounds() { + String result = ""; + try { + result += FileUtils.class.getSimpleName(); + } catch (NoClassDefFoundError e) { + result += "?"; + } + result += "/"; + try { + result += MultiSet.class.getSimpleName(); + } catch (NoClassDefFoundError e) { + result += "?"; + } + return result; + } + @IfBuildProfile("foo") @ApplicationScoped class HelloServiceFoo implements HelloService{ diff --git a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceBarTest.java b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceBarTest.java index 43778b299e4d8..d41dee53924cc 100644 --- a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceBarTest.java +++ b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceBarTest.java @@ -16,6 +16,6 @@ void testHelloEndpoint() { .when().get("/hello") .then() .statusCode(200) - .body(is("Bar: hello, from bar")); + .body(is("Bar: hello, from bar-FileUtils/MultiSet")); } } diff --git a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceFooTest.java b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceFooTest.java index 0f24972fd6bfa..fbad1e8b3d3c8 100644 --- a/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceFooTest.java +++ b/integration-tests/maven/src/test/resources/projects/multi-build-mode/src/test/java/org/acme/HelloResourceFooTest.java @@ -16,6 +16,6 @@ void testHelloEndpoint() { .when().get("/hello") .then() .statusCode(200) - .body(is("Foo: hello, from foo")); + .body(is("Foo: hello, from foo-FileUtils/MultiSet")); } }