This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch central in repository https://gitbox.apache.org/repos/asf/camel.git
commit b2edaadd8387819288326f072af9a2c18f2fee6f Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Mar 8 12:10:17 2024 +0100 CAMEL-20539: camel-jbang - Make it possible to turn off maven central so its easier to ensure all downloads can be done via maven proxy/mirror --- .../modules/ROOT/pages/camel-jbang.adoc | 6 ++ .../apache/camel/dsl/jbang/core/commands/Run.java | 14 ++++ .../java/org/apache/camel/main/KameletMain.java | 26 ++++++++ .../camel/main/download/DependencyDownloader.java | 20 ++++++ .../main/download/MavenDependencyDownloader.java | 31 ++++++++- .../camel/tooling/maven/MavenDownloader.java | 24 +++++++ .../camel/tooling/maven/MavenDownloaderImpl.java | 75 ++++++++++++++++------ 7 files changed, 175 insertions(+), 21 deletions(-) diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc index 25d0283e7f7..d50e92f81a4 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc @@ -3394,6 +3394,12 @@ The follow options related to _exporting_, can be configured in `application.pro |`camel.jbang.mavenSettingsSecurity` |Optional location of Maven settings-security.xml file to decrypt settings.xml +|`camel.jbang.mavenCentralEnabled` +|Whether downloading JARs from Maven Central repository is enabled + +|`camel.jbang.mavenApacheSnapshotEnabled` +|Whether downloading JARs from ASF Maven Snapshot repository is enabled + |`camel.jbang.exportDir` |Directory where the project will be exported diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java index 221259ad051..ee4a23b1bfc 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java @@ -167,6 +167,14 @@ public class Run extends CamelCommand { description = "Optional location of Maven settings-security.xml file to decrypt settings.xml") String mavenSettingsSecurity; + @Option(names = { "--maven-central-enabled" }, + description = "Whether downloading JARs from Maven Central repository is enabled") + boolean mavenCentralEnabled = true; + + @Option(names = { "--maven-apache-snapshot-enabled" }, + description = "Whether downloading JARs from ASF Maven Snapshot repository is enabled") + boolean mavenApacheSnapshotEnabled = true; + @Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. non-cached) resources") boolean fresh; @@ -441,6 +449,8 @@ public class Run extends CamelCommand { main.setFresh(fresh); main.setMavenSettings(mavenSettings); main.setMavenSettingsSecurity(mavenSettingsSecurity); + main.setMavenCentralEnabled(mavenCentralEnabled); + main.setMavenApacheSnapshotEnabled(mavenApacheSnapshotEnabled); main.setDownloadListener(new RunDownloadListener()); main.setAppName("Apache Camel (JBang)"); @@ -858,6 +868,10 @@ public class Run extends CamelCommand { repos = answer.getProperty("camel.jbang.repos", repos); mavenSettings = answer.getProperty("camel.jbang.maven-settings", mavenSettings); mavenSettingsSecurity = answer.getProperty("camel.jbang.maven-settings-security", mavenSettingsSecurity); + mavenCentralEnabled = "true" + .equals(answer.getProperty("camel.jbang.maven-central-enabled", mavenCentralEnabled ? "true" : "false")); + mavenApacheSnapshotEnabled = "true".equals(answer.getProperty("camel.jbang.maven-apache-snapshot-enabled", + mavenApacheSnapshotEnabled ? "true" : "false")); openapi = answer.getProperty("camel.jbang.open-api", openapi); download = "true".equals(answer.getProperty("camel.jbang.download", download ? "true" : "false")); background = "true".equals(answer.getProperty("camel.jbang.background", background ? "true" : "false")); diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java index 5b51d0d6f78..b22fe375f9e 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java @@ -110,6 +110,8 @@ public class KameletMain extends MainCommandLineSupport { private boolean verbose; private String mavenSettings; private String mavenSettingsSecurity; + boolean mavenCentralEnabled = true; + boolean mavenApacheSnapshotEnabled = true; private String stubPattern; private boolean silent; private DownloadListener downloadListener; @@ -267,6 +269,28 @@ public class KameletMain extends MainCommandLineSupport { return downloadListener; } + public boolean isMavenCentralEnabled() { + return mavenCentralEnabled; + } + + /** + * Whether downloading JARs from Maven Central repository is enabled + */ + public void setMavenCentralEnabled(boolean mavenCentralEnabled) { + this.mavenCentralEnabled = mavenCentralEnabled; + } + + public boolean isMavenApacheSnapshotEnabled() { + return mavenApacheSnapshotEnabled; + } + + /** + * Whether downloading JARs from ASF Maven Snapshot repository is enabled + */ + public void setMavenApacheSnapshotEnabled(boolean mavenApacheSnapshotEnabled) { + this.mavenApacheSnapshotEnabled = mavenApacheSnapshotEnabled; + } + /** * Sets a custom download listener */ @@ -384,6 +408,8 @@ public class KameletMain extends MainCommandLineSupport { downloader.setFresh(fresh); downloader.setMavenSettings(mavenSettings); downloader.setMavenSettingsSecurity(mavenSettingsSecurity); + downloader.setMavenCentralEnabled(mavenCentralEnabled); + downloader.setMavenApacheSnapshotEnabled(mavenApacheSnapshotEnabled); if (downloadListener != null) { downloader.addDownloadListener(downloadListener); } diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java index d8917437293..d325513c6e9 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java @@ -87,6 +87,26 @@ public interface DependencyDownloader extends CamelContextAware, StaticService { */ void setMavenSettingsSecurity(String mavenSettingsSecurity); + /** + * Whether downloading JARs from Maven Central repository is enabled + */ + boolean isMavenCentralEnabled(); + + /** + * Whether downloading JARs from Maven Central repository is enabled + */ + void setMavenCentralEnabled(boolean mavenCentralEnabled); + + /** + * Whether downloading JARs from ASF Maven Snapshot repository is enabled + */ + boolean isMavenApacheSnapshotEnabled(); + + /** + * Whether downloading JARs from ASF Maven Snapshot repository is enabled + */ + void setMavenApacheSnapshotEnabled(boolean mavenApacheSnapshotEnabled); + /** * Downloads the dependency incl transitive dependencies * diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java index 4e8f113fb09..de93bfd112d 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java @@ -83,6 +83,9 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende // settings.xml and settings-security.xml locations to be passed to MavenDownloader from camel-tooling-maven private String mavenSettings; private String mavenSettingsSecurity; + // to make it easy to turn off maven central/snapshot + boolean mavenCentralEnabled = true; + boolean mavenApacheSnapshotEnabled = true; @Override public CamelContext getCamelContext() { @@ -187,6 +190,26 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende this.mavenSettingsSecurity = mavenSettingsSecurity; } + @Override + public boolean isMavenCentralEnabled() { + return mavenCentralEnabled; + } + + @Override + public void setMavenCentralEnabled(boolean mavenCentralEnabled) { + this.mavenCentralEnabled = mavenCentralEnabled; + } + + @Override + public boolean isMavenApacheSnapshotEnabled() { + return mavenApacheSnapshotEnabled; + } + + @Override + public void setMavenApacheSnapshotEnabled(boolean mavenApacheSnapshotEnabled) { + this.mavenApacheSnapshotEnabled = mavenApacheSnapshotEnabled; + } + @Override public void downloadDependency(String groupId, String artifactId, String version) { downloadDependency(groupId, artifactId, version, true); @@ -243,7 +266,7 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende List<String> deps = List.of(gav); // include Apache snapshot to make it easy to use upcoming releases - boolean useApacheSnaphots = "org.apache.camel".equals(groupId) && version.contains("SNAPSHOT"); + boolean useApacheSnapshots = "org.apache.camel".equals(groupId) && version.contains("SNAPSHOT"); // include extra repositories (if any) - these will be used in addition // to the ones detected from ~/.m2/settings.xml and configured in @@ -256,7 +279,7 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende } List<MavenArtifact> artifacts = resolveDependenciesViaAether(deps, extraRepositories, - transitively, useApacheSnaphots); + transitively, useApacheSnapshots); List<File> files = new ArrayList<>(); if (verbose) { LOG.info("Resolved: {} -> [{}]", gav, artifacts); @@ -480,6 +503,8 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende MavenDownloaderImpl mavenDownloaderImpl = new MavenDownloaderImpl(); mavenDownloaderImpl.setMavenSettingsLocation(mavenSettings); mavenDownloaderImpl.setMavenSettingsSecurityLocation(mavenSettingsSecurity); + mavenDownloaderImpl.setMavenCentralEnabled(mavenCentralEnabled); + mavenDownloaderImpl.setMavenApacheSnapshotEnabled(mavenApacheSnapshotEnabled); mavenDownloaderImpl.setRepos(repos); mavenDownloaderImpl.setFresh(fresh); mavenDownloaderImpl.setOffline(!download); @@ -534,7 +559,7 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende try { return mavenDownloader.resolveArtifacts(depIds, extraRepositories, transitively, useApacheSnapshots); } catch (MavenResolutionException e) { - String repos = e.getRepositories() == null + String repos = (e.getRepositories() == null || e.getRepositories().isEmpty()) ? "(empty URL list)" : String.join(", ", e.getRepositories()); String msg = "Cannot resolve dependencies in " + repos; diff --git a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java index edae817ebb9..5dc197584bf 100644 --- a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java +++ b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java @@ -101,4 +101,28 @@ public interface MavenDownloader { */ void setRepositoryResolver(RepositoryResolver repositoryResolver); + /** + * Sets whether maven central repository should be included and as first in the list of repositories. This can be + * used to turn of maven central for users that may use their own maven proxy. + */ + void setMavenCentralEnabled(boolean mavenCentralEnabled); + + /** + * Sets whether maven central repository should be included and as first in the list of repositories. This can be + * used to turn of maven central for users that may use their own maven proxy. + */ + boolean isMavenCentralEnabled(); + + /** + * Sets whether using SNAPSHOT versions of Apache Camel is enabled. If enabled then SNAPSHOT can be downloaded from + * the ASF SNAPSHOT maven repository. + */ + void setMavenApacheSnapshotEnabled(boolean mavenApacheSnapshotEnabled); + + /** + * Sets whether using SNAPSHOT versions of Apache Camel is enabled. If enabled then SNAPSHOT can be downloaded from + * the ASF SNAPSHOT maven repository. + */ + boolean isMavenApacheSnapshotEnabled(); + } diff --git a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java index 3851955f771..0870e35e55c 100644 --- a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java +++ b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java @@ -233,6 +233,9 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload private static final RepositoryPolicy POLICY_DISABLED = new RepositoryPolicy( false, RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_IGNORE); + private boolean mavenCentralEnabled = true; + private boolean mavenApacheSnapshotEnabled = true; + private RepositoryResolver repositoryResolver; private RepositorySystem repositorySystem; @@ -326,9 +329,19 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload originalRepositories)); // mirroring/proxying Maven Central - centralResolutionRepository = remoteRepositories.get(0); + if (centralRepository == null && !remoteRepositories.isEmpty()) { + for (RemoteRepository repo : remoteRepositories) { + if ("central".equals(repo.getId())) { + centralRepository = repo; + break; + } else if (repo.getHost().startsWith("repo1.maven.org") || repo.getHost().startsWith("repo2.maven.org")) { + centralRepository = repo; + break; + } + } + } - if (!apacheSnapshotsIncluded) { + if (mavenApacheSnapshotEnabled && !apacheSnapshotsIncluded) { // process apache snapshots even if it's not present in remoteRepositories, because it // may be used on demand for each download/resolution request apacheSnapshotsResolutionRepository = repositorySystem.newResolutionRepositories(repositorySystemSession, @@ -371,7 +384,7 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload repositories.addAll(repositorySystem.newResolutionRepositories(repositorySystemSession, extraRemoteRepositories)); } - if (useApacheSnapshots && !apacheSnapshotsIncluded) { + if (mavenApacheSnapshotEnabled && useApacheSnapshots && !apacheSnapshotsIncluded) { repositories.add(apacheSnapshotsResolutionRepository); } @@ -1171,18 +1184,22 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload // a set to prevent duplicates, but do not store URLs directly (hashCode() may lead to DNS resolution!) Set<String> repositoryURLs = new HashSet<>(); - // add maven central first - always - centralRepository = new RemoteRepository.Builder("central", "default", MAVEN_CENTRAL_REPO) - .setReleasePolicy(defaultPolicy) - .setSnapshotPolicy(POLICY_DISABLED) - .build(); - repositories.add(centralRepository); + if (mavenCentralEnabled) { + // add maven central first - always + centralRepository = new RemoteRepository.Builder("central", "default", MAVEN_CENTRAL_REPO) + .setReleasePolicy(defaultPolicy) + .setSnapshotPolicy(POLICY_DISABLED) + .build(); + repositories.add(centralRepository); + } - // configure Apache snapshots - to be used if needed - apacheSnapshotsRepository = new RemoteRepository.Builder("apache-snapshot", "default", APACHE_SNAPSHOT_REPO) - .setReleasePolicy(POLICY_DISABLED) - .setSnapshotPolicy(defaultPolicy) - .build(); + if (mavenApacheSnapshotEnabled) { + // configure Apache snapshots - to be used if needed + apacheSnapshotsRepository = new RemoteRepository.Builder("apache-snapshot", "default", APACHE_SNAPSHOT_REPO) + .setReleasePolicy(POLICY_DISABLED) + .setSnapshotPolicy(defaultPolicy) + .build(); + } // and custom repos and remember URLs to not duplicate the repositories from the settings if (repos != null) { @@ -1206,7 +1223,8 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload try { URL url = new URL(r.getUrl()); if (repositoryURLs.add(r.getUrl())) { - if (url.getHost().equals("repository.apache.org") && url.getPath().startsWith("/snapshots")) { + if (mavenApacheSnapshotEnabled && url.getHost().equals("repository.apache.org") + && url.getPath().startsWith("/snapshots")) { // record that Apache Snapshots repository is included in default (always used) // repositories and used preconfigured instance of o.e.aether.repository.RemoteRepository apacheSnapshotsIncluded = true; @@ -1252,7 +1270,7 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload /** * Helper method to translate a collection of Strings for remote repository URLs into actual instances of - * {@link RemoteRepository} added to the passed {@code repositories}. We don't detected duplicates here and we don't + * {@link RemoteRepository} added to the passed {@code repositories}. We don't detect duplicates here, and we don't * do mirror/proxy processing of the repositories. */ private void configureRepositories(List<RemoteRepository> repositories, Set<String> urls) { @@ -1260,11 +1278,12 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload try { repo = repositoryResolver.resolveRepository(repo); URL url = new URL(repo); - if (url.getHost().equals("repo1.maven.org")) { + if (mavenCentralEnabled && url.getHost().equals("repo1.maven.org")) { // Maven Central is always used, so skip it return; } - if (url.getHost().equals("repository.apache.org") && url.getPath().contains("/snapshots")) { + if (mavenApacheSnapshotEnabled && url.getHost().equals("repository.apache.org") + && url.getPath().contains("/snapshots")) { // Apache Snapshots added, so we'll use our own definition of this repository repositories.add(apacheSnapshotsRepository); } else { @@ -1316,6 +1335,26 @@ public class MavenDownloaderImpl extends ServiceSupport implements MavenDownload this.offline = offline; } + @Override + public boolean isMavenCentralEnabled() { + return mavenCentralEnabled; + } + + @Override + public void setMavenCentralEnabled(boolean mavenCentralEnabled) { + this.mavenCentralEnabled = mavenCentralEnabled; + } + + @Override + public boolean isMavenApacheSnapshotEnabled() { + return mavenApacheSnapshotEnabled; + } + + @Override + public void setMavenApacheSnapshotEnabled(boolean mavenApacheSnapshotEnabled) { + this.mavenApacheSnapshotEnabled = mavenApacheSnapshotEnabled; + } + private static class AcceptAllDependencyFilter implements DependencyFilter { @Override public boolean accept(DependencyNode node, List<DependencyNode> parents) {