This is an automated email from the ASF dual-hosted git repository.
Croway pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 834637ab4778 camel-jbang: honour the configured Maven environment in
doctor (#28515)
834637ab4778 is described below
commit 834637ab47784fa1addc11ce3007316f4e6b70bd
Author: Federico Mariani <[email protected]>
AuthorDate: Mon Oct 26 14:46:29 2026 +0100
camel-jbang: honour the configured Maven environment in doctor (#28515)
* fix: camel-jbang doctor honours the configured Maven environment
* docs: remove doctor upgrade guide additions
---
.../ROOT/pages/camel-jbang-getting-started.adoc | 10 +++
.../camel/dsl/jbang/core/commands/Doctor.java | 10 +++
.../jbang/core/commands/DoctorRepositoryTest.java | 92 ++++++++++++++++++++++
.../camel/dsl/jbang/core/commands/DoctorTest.java | 80 +++++++++++++++++++
4 files changed, 192 insertions(+)
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
b/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
index da6c1c4bbcfc..790feaa6c834 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
@@ -242,6 +242,16 @@ camel doctor
This checks Camel and Java versions, JBang availability, Maven repository
connectivity,
container runtime (Docker/Podman), and disk space.
+The Maven check resolves `camel-api` for the bundled Camel version using the
default Maven settings and repositories.
+It also honours the `camel.jbang.repos`, `camel.jbang.maven-settings`,
`camel.jbang.maven-settings-security`,
+`camel.jbang.maven-central-enabled`,
`camel.jbang.maven-apache-snapshot-enabled`, `camel.jbang.download`, and
+`camel.jbang.fresh` JVM system properties. Additional repositories configured
through `camel.extra.repos`
+are also used.
+
+The command returns a non-zero exit code when a required check fails,
including Maven artifact resolution.
+Missing optional tools, occupied ports, and low temporary disk space do not
fail the command.
+
+
== Explore commands
Every command supports `--help`:
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
index 856df9bca23b..cdcac4b626d2 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
@@ -26,6 +26,7 @@ import java.util.Set;
import org.apache.camel.catalog.CamelCatalog;
import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.dsl.jbang.core.common.CamelJBangConstants;
import org.apache.camel.dsl.jbang.core.common.CliExitCode;
import org.apache.camel.dsl.jbang.core.common.ExternalCommand;
import org.apache.camel.dsl.jbang.core.common.InstallDetector;
@@ -171,6 +172,15 @@ public class Doctor extends CamelCommand {
private void checkMavenRepository() {
try (MavenDownloaderImpl downloader = new MavenDownloaderImpl()) {
+ downloader.setRepos(System.getProperty(CamelJBangConstants.REPOS));
+
downloader.setMavenSettingsLocation(System.getProperty(CamelJBangConstants.MAVEN_SETTINGS));
+
downloader.setMavenSettingsSecurityLocation(System.getProperty(CamelJBangConstants.MAVEN_SETTINGS_SECURITY));
+ downloader.setMavenCentralEnabled(Boolean.parseBoolean(
+
System.getProperty(CamelJBangConstants.MAVEN_CENTRAL_ENABLED, "true")));
+ downloader.setMavenApacheSnapshotEnabled(Boolean.parseBoolean(
+
System.getProperty(CamelJBangConstants.MAVEN_APACHE_SNAPSHOTS, "true")));
+
downloader.setOffline(!Boolean.parseBoolean(System.getProperty(CamelJBangConstants.DOWNLOAD,
"true")));
+
downloader.setFresh(Boolean.parseBoolean(System.getProperty(CamelJBangConstants.FRESH,
"false")));
downloader.build();
CamelCatalog catalog = new DefaultCamelCatalog();
String version = catalog.getCatalogVersion();
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorRepositoryTest.java
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorRepositoryTest.java
new file mode 100644
index 000000000000..8804d314945f
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorRepositoryTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ * http://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.apache.camel.dsl.jbang.core.commands;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.dsl.jbang.core.common.CamelJBangConstants;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.junitpioneer.jupiter.ClearSystemProperty;
+import org.junitpioneer.jupiter.SetSystemProperty;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SetSystemProperty(key = CamelJBangConstants.MAVEN_CENTRAL_ENABLED, value =
"false")
+@SetSystemProperty(key = CamelJBangConstants.MAVEN_APACHE_SNAPSHOTS, value =
"false")
+@SetSystemProperty(key = CamelJBangConstants.DOWNLOAD, value = "true")
+@SetSystemProperty(key = CamelJBangConstants.FRESH, value = "false")
+@ClearSystemProperty(key = CamelJBangConstants.REPOS)
+@ClearSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS)
+@ClearSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS_SECURITY)
+@ClearSystemProperty(key = "camel.extra.repos")
+@ClearSystemProperty(key = "camel.default.extra.repos.default.value")
+@ClearSystemProperty(key = "maven.repo.local")
+@ClearSystemProperty(key = "camel.launcher")
+class DoctorRepositoryTest extends CamelCommandBaseTestSupport {
+
+ @TempDir
+ Path directory;
+
+ private Path repository;
+
+ @BeforeEach
+ void configureRepository() throws Exception {
+ Path settings = directory.resolve("settings.xml");
+ Files.writeString(settings,
+ "<settings><localRepository>" + directory.resolve("cache") +
"</localRepository></settings>");
+ System.setProperty(CamelJBangConstants.MAVEN_SETTINGS,
settings.toString());
+
+ repository = directory.resolve("repository");
+ String version = new DefaultCamelCatalog().getCatalogVersion();
+ Path artifactDirectory =
repository.resolve("org/apache/camel/camel-api").resolve(version);
+ Files.createDirectories(artifactDirectory);
+ Path artifact = artifactDirectory.resolve("camel-api-" + version +
".jar");
+ try (JarOutputStream jar = new
JarOutputStream(Files.newOutputStream(artifact))) {
+ jar.putNextEntry(new JarEntry("META-INF/MANIFEST.MF"));
+ jar.write("Manifest-Version:
1.0\n\n".getBytes(StandardCharsets.UTF_8));
+ jar.closeEntry();
+ }
+ }
+
+ @Test
+ void resolvesArtifactFromConfiguredRepositoryWithEmptyCache() throws
Exception {
+ System.setProperty(CamelJBangConstants.REPOS, "product=" +
repository.toUri());
+ Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+ assertThat(command.doCall()).isZero();
+ assertThat(printer.getOutput()).contains("Artifact resolution (OK)");
+ String version = new DefaultCamelCatalog().getCatalogVersion();
+ assertThat(
+
directory.resolve("cache/org/apache/camel/camel-api").resolve(version).resolve("camel-api-"
+ version + ".jar"))
+ .exists();
+ }
+
+ @Test
+ void missingArtifactFailsWithEmptyCache() throws Exception {
+ Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+ assertThat(command.doCall()).isEqualTo(1);
+ assertThat(printer.getOutput()).contains("Artifact resolution failed",
"Disk Space:");
+ }
+}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
index cd8d9809a175..539b14a8deff 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
@@ -19,20 +19,100 @@ package org.apache.camel.dsl.jbang.core.commands;
import java.nio.file.Path;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.dsl.jbang.core.common.CamelJBangConstants;
import org.apache.camel.dsl.jbang.core.common.CliExitCode;
import org.apache.camel.dsl.jbang.core.common.InstallDetector;
import org.apache.camel.dsl.jbang.core.common.OllamaDoctorSupport;
+import org.apache.camel.tooling.maven.MavenDownloaderImpl;
+import org.apache.camel.tooling.maven.MavenResolutionException;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
import org.apache.camel.util.json.Jsoner;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junitpioneer.jupiter.SetSystemProperty;
+import org.mockito.MockedConstruction;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.anySet;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.verify;
class DoctorTest extends CamelCommandBaseTestSupport {
+ private MockedConstruction<MavenDownloaderImpl> downloaders;
+ private MavenResolutionException resolutionFailure;
+ private boolean initializationFailure;
+
+ @BeforeEach
+ void mockDownloader() {
+ downloaders = mockConstruction(MavenDownloaderImpl.class, (downloader,
context) -> {
+ if (initializationFailure) {
+ doThrow(new IllegalStateException("Invalid Maven
settings")).when(downloader).build();
+ }
+ if (resolutionFailure != null) {
+
doThrow(resolutionFailure).when(downloader).resolveArtifacts(anyList(),
anySet(), anyBoolean(), anyBoolean());
+ }
+ });
+ }
+
+ @AfterEach
+ void closeDownloaderMocks() {
+ downloaders.close();
+ }
+
+ @Test
+ void mavenResolutionFailureFailsCommand() throws Exception {
+ resolutionFailure = new MavenResolutionException("Product artifact
unavailable");
+ Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+ assertThat(command.doCall()).isEqualTo(1);
+ assertThat(printer.getOutput()).contains("Artifact resolution failed",
"Product artifact unavailable", "Disk Space:");
+ }
+
+ @Test
+ void mavenInitializationFailureFailsCommand() throws Exception {
+ initializationFailure = true;
+ Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+ assertThat(command.doCall()).isEqualTo(1);
+ assertThat(printer.getOutput()).contains("Invalid Maven settings",
"Disk Space:");
+ }
+
+ @Test
+ @SetSystemProperty(key = CamelJBangConstants.REPOS, value =
"product=file:/product-repository")
+ @SetSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS, value =
"custom-settings.xml")
+ @SetSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS_SECURITY,
value = "custom-settings-security.xml")
+ @SetSystemProperty(key = CamelJBangConstants.MAVEN_CENTRAL_ENABLED, value
= "false")
+ @SetSystemProperty(key = CamelJBangConstants.MAVEN_APACHE_SNAPSHOTS, value
= "false")
+ @SetSystemProperty(key = CamelJBangConstants.DOWNLOAD, value = "false")
+ @SetSystemProperty(key = CamelJBangConstants.FRESH, value = "true")
+ void usesConfiguredMavenEnvironment() throws Exception {
+ Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+ assertThat(command.doCall()).isZero();
+ assertThat(downloaders.constructed()).hasSize(1);
+ MavenDownloaderImpl downloader = downloaders.constructed().get(0);
+ verify(downloader).setRepos("product=file:/product-repository");
+ verify(downloader).setMavenSettingsLocation("custom-settings.xml");
+
verify(downloader).setMavenSettingsSecurityLocation("custom-settings-security.xml");
+ verify(downloader).setMavenCentralEnabled(false);
+ verify(downloader).setMavenApacheSnapshotEnabled(false);
+ verify(downloader).setOffline(true);
+ verify(downloader).setFresh(true);
+ verify(downloader).resolveArtifacts(
+ List.of("org.apache.camel:camel-api:" + new
DefaultCamelCatalog().getCatalogVersion()),
+ Set.of(), false, false);
+ }
+
@Test
public void exitCodeFollowsTheChecks() throws Exception {
Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));