diff --git a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java index a0cdf5ca05568..42ee7146494d4 100644 --- a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java +++ b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java @@ -264,7 +264,8 @@ public boolean visitLeave(DependencyNode node) { } } - List fullDeploymentDeps = new ArrayList<>(userDeps); + List fullDeploymentDeps = new ArrayList<>(userDeps.size() + deploymentDeps.size()); + fullDeploymentDeps.addAll(userDeps); fullDeploymentDeps.addAll(deploymentDeps); //we need these to have a type of 'jar' //type is blank when loaded diff --git a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/DeploymentInjectingDependencyVisitor.java b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/DeploymentInjectingDependencyVisitor.java index 2619a0d806cb5..a72db431465c0 100644 --- a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/DeploymentInjectingDependencyVisitor.java +++ b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/DeploymentInjectingDependencyVisitor.java @@ -40,10 +40,9 @@ public static Artifact getRuntimeArtifact(DependencyNode dep) { private final MavenArtifactResolver resolver; private final List managedDeps; - private final List runtimeExtensionDeps = new ArrayList<>(); private final List mainRepos; - boolean injectedDeps; + private boolean collectExtensions = true; private List runtimeNodes = new ArrayList<>(); private final AppModel.Builder appBuilder; @@ -57,7 +56,7 @@ public DeploymentInjectingDependencyVisitor(MavenArtifactResolver resolver, List } public boolean isInjectedDeps() { - return injectedDeps; + return !runtimeNodes.isEmpty(); } public void injectDeploymentDependencies(DependencyNode root) throws BootstrapDependencyProcessingException { @@ -68,10 +67,7 @@ public void injectDeploymentDependencies(DependencyNode root) throws BootstrapDe } } - public void collectRuntimeExtensions(List list) { - if (list.isEmpty()) { - return; - } + private void collectRuntimeExtensions(List list) { int i = 0; while (i < list.size()) { collectRuntimeExtensions(list.get(i++)); @@ -84,54 +80,59 @@ private void collectRuntimeExtensions(DependencyNode node) { return; } final Path path = resolve(artifact); + final boolean parentCollectsExtensions = collectExtensions; try { if (Files.isDirectory(path)) { - processMetaInfDir(node, path.resolve(BootstrapConstants.META_INF)); + collectExtensions &= !processMetaInfDir(node, path.resolve(BootstrapConstants.META_INF)); } else { try (FileSystem artifactFs = ZipUtils.newFileSystem(path)) { - processMetaInfDir(node, artifactFs.getPath(BootstrapConstants.META_INF)); + collectExtensions &= !processMetaInfDir(node, artifactFs.getPath(BootstrapConstants.META_INF)); } } + collectRuntimeExtensions(node.getChildren()); + } catch (DeploymentInjectionException e) { + throw e; } catch (Exception t) { throw new DeploymentInjectionException("Failed to inject extension deplpyment dependencies", t); + } finally { + collectExtensions = parentCollectsExtensions; } - collectRuntimeExtensions(node.getChildren()); } - private void processMetaInfDir(DependencyNode node, Path metaInfDir) throws BootstrapDependencyProcessingException { - if (!Files.exists(metaInfDir)) { - return; - } + /** + * @return true in case the node is a Quarkus runtime extension artifact, otherwise - false + * @throws BootstrapDependencyProcessingException in case of a failure + */ + private boolean processMetaInfDir(DependencyNode node, Path metaInfDir) throws BootstrapDependencyProcessingException { final Path p = metaInfDir.resolve(BootstrapConstants.DESCRIPTOR_FILE_NAME); - if (!Files.exists(p)) { - return; - } - processPlatformArtifact(node, p); + return Files.exists(p) ? processPlatformArtifact(node, p) : false; } - private void processPlatformArtifact(DependencyNode node, Path descriptor) throws BootstrapDependencyProcessingException { + /** + * @return true in case the node is a Quarkus runtime extension artifact, otherwise - false + * @throws BootstrapDependencyProcessingException in case of a failure + */ + private boolean processPlatformArtifact(DependencyNode node, Path descriptor) + throws BootstrapDependencyProcessingException { final Properties rtProps = resolveDescriptor(descriptor); if (rtProps == null) { - return; + return false; } - final String value = rtProps.getProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT); appBuilder.handleExtensionProperties(rtProps, node.getArtifact().toString()); + final String value = rtProps.getProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT); if (value == null) { - return; + return false; } Artifact deploymentArtifact = toArtifact(value); if (deploymentArtifact.getVersion() == null || deploymentArtifact.getVersion().isEmpty()) { deploymentArtifact = deploymentArtifact.setVersion(node.getArtifact().getVersion()); } - node.setData(QUARKUS_DEPLOYMENT_ARTIFACT, deploymentArtifact); - runtimeNodes.add(node); - Dependency dependency = new Dependency(node.getArtifact(), JavaScopes.COMPILE); - runtimeExtensionDeps.add(dependency); managedDeps.add(new Dependency(deploymentArtifact, JavaScopes.COMPILE)); - } - - public List getRuntimeExtensionDeps() { - return runtimeExtensionDeps; + if (collectExtensions) { + node.setData(QUARKUS_DEPLOYMENT_ARTIFACT, deploymentArtifact); + runtimeNodes.add(node); + } + return true; } private void replaceWith(DependencyNode originalNode, DependencyNode newNode) @@ -149,7 +150,6 @@ private void replaceWith(DependencyNode originalNode, DependencyNode newNode) originalNode.setArtifact(newNode.getArtifact()); originalNode.getDependency().setArtifact(newNode.getArtifact()); originalNode.setChildren(children); - injectedDeps = true; } private DependencyNode collectDependencies(Artifact artifact) throws BootstrapDependencyProcessingException {