You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/06/07 08:22:32 UTC
[camel] 01/03: CAMEL-18079: camel-jbang - Add support for 3rd party maven repositories
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 748cc89b3d9cc4d631ff987e217b4064e411c454
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jun 7 10:10:29 2022 +0200
CAMEL-18079: camel-jbang - Add support for 3rd party maven repositories
---
.../apache/camel/dsl/jbang/core/commands/Run.java | 8 ++++-
.../camel/dsl/jbang/core/commands/UberJar.java | 6 ++++
.../org/apache/camel/main/DownloaderHelper.java | 33 ++++++++++++++++++
.../java/org/apache/camel/main/KameletMain.java | 25 ++++++++++++++
.../src/main/resources/camelGrapeConfig.xml | 40 ++++++++++++++++++++++
5 files changed, 111 insertions(+), 1 deletion(-)
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 6c144f5ca51..3fb0f8f7e18 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
@@ -99,9 +99,12 @@ class Run extends CamelCommand {
String[] files;
@Option(names = {
- "--dep", "--deps" }, description = "Add additional dependencies (Use commas to separate them).")
+ "--dep", "--deps" }, description = "Add additional dependencies (Use commas to separate multiple dependencies).")
String dependencies;
+ @Option(names = {"--repos"}, description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories).")
+ String repos;
+
@Option(names = { "--name" }, defaultValue = "CamelJBang", description = "The name of the Camel application")
String name;
@@ -286,6 +289,7 @@ class Run extends CamelCommand {
} else {
propertiesFiles = propertiesFiles + ",file:" + profilePropertiesFile.getName();
}
+ repos = profileProperties.getProperty("camel.jbang.repos", repos);
}
// if no specific file to run then try to auto-detect
@@ -308,6 +312,7 @@ class Run extends CamelCommand {
final KameletMain main = createMainInstance();
final Set<String> downloaded = new HashSet<>();
+ main.setRepos(repos);
main.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadDependency(String groupId, String artifactId, String version) {
@@ -338,6 +343,7 @@ class Run extends CamelCommand {
// allow java-dsl to compile to .class which we need in uber-jar mode
writeSetting(main, profileProperties, "camel.main.routesCompileDirectory", WORK_DIR);
writeSetting(main, profileProperties, "camel.jbang.dependencies", dependencies);
+ writeSetting(main, profileProperties, "camel.jbang.repos", repos);
writeSetting(main, profileProperties, "camel.jbang.health", health ? "true" : "false");
writeSetting(main, profileProperties, "camel.jbang.console", console ? "true" : "false");
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/UberJar.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/UberJar.java
index 81e555285d5..4e8616bdf90 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/UberJar.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/UberJar.java
@@ -141,6 +141,12 @@ class UberJar extends CamelCommand {
buildDir = new File(LIB_DIR);
buildDir.mkdirs();
for (String l : lines) {
+ // support 3rd party maven repositories
+ File grapeConfig = new File(".camel-jbang/camelGrapeConfig.xml");
+ if (grapeConfig.exists()) {
+ System.setProperty("grape.config", grapeConfig.getAbsolutePath());
+ }
+
if (l.startsWith("dependency=")) {
l = StringHelper.after(l, "dependency=");
MavenGav gav = MavenGav.parseGav(null, l);
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java
index 62ef40adeb6..1398909bab1 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/DownloaderHelper.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.main;
+import java.io.File;
+import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
@@ -23,6 +25,7 @@ import java.util.Map;
import groovy.grape.Grape;
import org.apache.camel.CamelContext;
+import org.apache.camel.util.IOHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -108,4 +111,34 @@ public final class DownloaderHelper {
return false;
}
+ public static void prepareDownloader(CamelContext camelContext, String repos) throws Exception {
+ InputStream is = DownloaderHelper.class.getResourceAsStream("/camelGrapeConfig.xml");
+ if (is != null) {
+ String xml = IOHelper.loadText(is);
+ if (repos != null) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(" <!-- custom repositories -->");
+ int i = 0;
+ for (String repo : repos.split(",")) {
+ i++;
+ sb.append(String.format("\n <url name=\"repo%s\" m2compatible=\"true\">", i));
+ sb.append(String.format(
+ "\n <artifact pattern=\"%s/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]\"/>",
+ repo));
+ sb.append(String.format("\n </url>"));
+ }
+ xml = xml.replace(" <!-- @repos@ -->", sb.toString());
+ }
+
+ // save file to local disk and point grape to use this
+ File out = new File(".camel-jbang/camelGrapeConfig.xml");
+ IOHelper.writeText(xml, out);
+
+ // Grape should use our custom configuration file
+ System.setProperty("grape.config", out.getAbsolutePath());
+
+ IOHelper.close(is);
+ }
+ }
+
}
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 b695a58c7f4..0da80cffeba 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
@@ -39,6 +39,7 @@ public class KameletMain extends MainCommandLineSupport {
protected final MainRegistry registry = new MainRegistry();
private boolean download = true;
+ private String repos;
private boolean stub;
private DownloadListener downloadListener;
private GroovyClassLoader groovyClassLoader;
@@ -117,6 +118,17 @@ public class KameletMain extends MainCommandLineSupport {
this.download = download;
}
+ public String getRepos() {
+ return repos;
+ }
+
+ /**
+ * Additional maven repositories for download on-demand (Use commas to separate multiple repositories).
+ */
+ public void setRepos(String repos) {
+ this.repos = repos;
+ }
+
public boolean isStub() {
return stub;
}
@@ -167,6 +179,16 @@ public class KameletMain extends MainCommandLineSupport {
}
}
});
+ addOption(new ParameterOption(
+ "repos", "repositories", "Additional maven repositories for download on-demand.",
+ "repos") {
+ @Override
+ protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) {
+ if (arg.equals("-repos")) {
+ setRepos(parameter);
+ }
+ }
+ });
}
@Override
@@ -278,6 +300,9 @@ public class KameletMain extends MainCommandLineSupport {
if (download) {
// use resolvers that can auto downloaded
try {
+ // prepare grape config with custom repositories
+ DownloaderHelper.prepareDownloader(camelContext, repos);
+
// dependencies from CLI
Object dependencies = getInitialProperties().get("camel.jbang.dependencies");
if (dependencies != null) {
diff --git a/dsl/camel-kamelet-main/src/main/resources/camelGrapeConfig.xml b/dsl/camel-kamelet-main/src/main/resources/camelGrapeConfig.xml
new file mode 100644
index 00000000000..2aa4400ed84
--- /dev/null
+++ b/dsl/camel-kamelet-main/src/main/resources/camelGrapeConfig.xml
@@ -0,0 +1,40 @@
+<!--
+
+ 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.
+
+-->
+<ivysettings>
+ <!-- disable download of source and javadoc to be faster -->
+ <property name="ivy.maven.lookup.sources" value="false"/>
+ <property name="ivy.maven.lookup.javadoc" value="false"/>
+ <settings defaultResolver="downloadGrapes"/>
+ <resolvers>
+ <chain name="downloadGrapes" returnFirst="true">
+ <!-- grapes -->
+ <filesystem name="cachedGrapes">
+ <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/>
+ <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]"/>
+ </filesystem>
+ <!-- local m2 -->
+ <ibiblio name="localm2" root="${user.home.url}/.m2/repository/" checkmodified="true" changingPattern=".*" changingMatcher="regexp" m2compatible="true"/>
+ <!-- maven central -->
+ <ibiblio name="maven2" m2compatible="true"/>
+ <!-- @repos@ -->
+ </chain>
+ </resolvers>
+</ivysettings>