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/04/21 19:15:28 UTC

[camel] 05/06: CAMEL-17998: camel-jbang - fat-jar command

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 3e9987823e9e2743eb79fb3fb7ff6d6d063ef8f8
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Apr 21 19:00:59 2022 +0200

    CAMEL-17998: camel-jbang - fat-jar command
---
 .../dsl/jbang/core/commands/CamelJBangMain.java    |  3 +-
 .../camel/dsl/jbang/core/commands/Create.java      |  1 +
 .../core/commands/{FarJar.java => FatJar.java}     | 73 ++++++++++++++++------
 .../core/commands/{Create.java => Package.java}    |  4 +-
 .../camel/dsl/jbang/core/commands/Project.java     |  1 +
 5 files changed, 60 insertions(+), 22 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index ed8eaa64caa..aeb1ea2624f 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -37,8 +37,9 @@ public class CamelJBangMain implements Callable<Integer> {
                         .addSubcommand("languages", new SearchLanguages())
                         .addSubcommand("others", new SearchOthers()))
                 .addSubcommand("create", new CommandLine(new Create())
-                        .addSubcommand("fat-jar", new FarJar())
                         .addSubcommand("project", new Project()))
+                .addSubcommand("package", new CommandLine(new Package())
+                        .addSubcommand("fat-jar", new FatJar()))
                 .addSubcommand("generate", new CommandLine(new CodeGenerator())
                         .addSubcommand("rest", new CodeRestGenerator()));
 
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Create.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Create.java
index 83f47576bca..b0d4ce4787d 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Create.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Create.java
@@ -23,6 +23,7 @@ import picocli.CommandLine.Command;
 import picocli.CommandLine.Option;
 
 @Command(name = "create", description = "Creates Maven Project (use --help)")
+@Deprecated
 class Create implements Callable<Integer> {
     //CHECKSTYLE:OFF
     @Option(names = { "-h", "--help" }, usageHelp = true, description = "Display the help and sub-commands")
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/FarJar.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/FatJar.java
similarity index 70%
rename from dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/FarJar.java
rename to dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/FatJar.java
index cfa5e58580b..ee327ac9140 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/FarJar.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/FatJar.java
@@ -18,8 +18,10 @@ package org.apache.camel.dsl.jbang.core.commands;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.InputStream;
 import java.net.URI;
 import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -37,7 +39,7 @@ import picocli.CommandLine.Command;
 import picocli.CommandLine.Option;
 
 @Command(name = "fat-jar", description = "Package application as a single fat-jar")
-class FarJar implements Callable<Integer> {
+class FatJar implements Callable<Integer> {
 
     //CHECKSTYLE:OFF
     @Option(names = { "-h", "--help" }, usageHelp = true, description = "Display the help and sub-commands")
@@ -52,7 +54,7 @@ class FarJar implements Callable<Integer> {
             return 0;
         }
 
-        File target = new File("target/camel-app/lib");
+        File target = new File("target/camel-app/");
         FileUtil.removeDir(target);
         target.mkdirs();
 
@@ -60,8 +62,26 @@ class FarJar implements Callable<Integer> {
         ClassLoader parentCL = KameletMain.class.getClassLoader();
         final GroovyClassLoader gcl = new GroovyClassLoader(parentCL);
 
+        // copy settings also (but not as hidden file)
+        File out = new File(target, Run.RUN_SETTINGS_FILE.substring(1));
+        safeCopy(settings, out, true);
+
+        // routes
+        target = new File("target/camel-app/");
+        copyFiles(settings, target);
+
+        // log4j configuration
+        InputStream is = FatJar.class.getResourceAsStream("/log4j2.properties");
+        safeCopy(is, new File(target, "log4j2.properties"), false);
+
         List<String> lines = Files.readAllLines(settings.toPath());
 
+        // include log4j dependencies
+        lines.add("dependency=org.apache.logging.log4j:log4j-api:2.17.2");
+        lines.add("dependency=org.apache.logging.log4j:log4j-core:2.17.2");
+        lines.add("dependency=org.apache.logging.log4j:log4j-slf4j-impl:2.17.2");
+        lines.add("dependency=org.fusesource.jansi:jansi:2.4.0");
+
         // include camel-kamelet-main as its a core dependency needed
         Optional<MavenGav> first = lines.stream()
                 .filter(l -> l.startsWith("dependency="))
@@ -73,6 +93,9 @@ class FarJar implements Callable<Integer> {
             lines.add(0, "dependency=mvn:org.apache.camel:camel-kamelet-main:" + v);
         }
 
+        // JARs should be in lib sub-folder
+        target = new File("target/camel-app/lib");
+        target.mkdirs();
         for (String l : lines) {
             if (l.startsWith("dependency=")) {
                 l = StringHelper.after(l, "dependency=");
@@ -89,15 +112,6 @@ class FarJar implements Callable<Integer> {
             }
         }
 
-        // copy route files
-        // TODO: 3rd party .jar should be in lib
-        target = new File("target/camel-app/");
-        copyFiles(settings, target);
-
-        // copy settings also (but not as hidden file)
-        File out = new File(target, Run.RUN_SETTINGS_FILE.substring(1));
-        Files.copy(settings.toPath(), out.toPath());
-
         return 0;
     }
 
@@ -111,11 +125,9 @@ class FarJar implements Callable<Integer> {
             for (String f : files.split(",")) {
                 if (f.startsWith("file:")) {
                     f = f.substring(5);
-                    File s = new File(f);
-                    if (s.exists() && s.isFile()) {
-                        File out = new File(target, s.getName());
-                        Files.copy(s.toPath(), out.toPath());
-                    }
+                    File source = new File(f);
+                    File out = new File(target, source.getName());
+                    safeCopy(source, out, true);
                 }
             }
         }
@@ -125,9 +137,32 @@ class FarJar implements Callable<Integer> {
         for (URI u : uris) {
             File f = new File(u.toURL().getFile());
             File out = new File(target, f.getName());
-            if (!out.exists()) {
-                Files.copy(f.toPath(), out.toPath());
-            }
+            safeCopy(f, out, false);
+        }
+    }
+
+    private void safeCopy(File source, File target, boolean override) throws Exception {
+        if (!source.exists()) {
+            return;
+        }
+
+        if (!target.exists()) {
+            Files.copy(source.toPath(), target.toPath());
+        } else if (override) {
+            Files.copy(source.toPath(), target.toPath(),
+                    StandardCopyOption.REPLACE_EXISTING);
+        }
+    }
+
+    private void safeCopy(InputStream source, File target, boolean override) throws Exception {
+        if (source == null) {
+            return;
+        }
+
+        if (!target.exists()) {
+            Files.copy(source, target.toPath());
+        } else if (override) {
+            Files.copy(source, target.toPath(), StandardCopyOption.REPLACE_EXISTING);
         }
     }
 
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Create.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Package.java
similarity index 91%
copy from dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Create.java
copy to dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Package.java
index 83f47576bca..82f63be3c43 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Create.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Package.java
@@ -22,8 +22,8 @@ import picocli.CommandLine;
 import picocli.CommandLine.Command;
 import picocli.CommandLine.Option;
 
-@Command(name = "create", description = "Creates Maven Project (use --help)")
-class Create implements Callable<Integer> {
+@Command(name = "package", description = "Package Camel application (use --help)")
+class Package implements Callable<Integer> {
     //CHECKSTYLE:OFF
     @Option(names = { "-h", "--help" }, usageHelp = true, description = "Display the help and sub-commands")
     private boolean helpRequested = false;
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Project.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Project.java
index 416cc7eff17..6d041040ee1 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Project.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Project.java
@@ -41,6 +41,7 @@ import org.apache.camel.dsl.jbang.core.generator.QuarkusGenerator;
 import picocli.CommandLine;
 
 @CommandLine.Command(name = "create-project", description = "Creates Camel-Quarkus project")
+@Deprecated
 public class Project implements Callable<Integer> {
 
     private static final String PACKAGE_REGEX = "package\\s+([a-zA_Z_][\\.\\w]*);";