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


The following commit(s) were added to refs/heads/main by this push:
     new 7e8948d823a Export (#10980)
7e8948d823a is described below

commit 7e8948d823a36399e3fe43d49df493187de5c0ee
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Aug 3 19:11:08 2023 +0200

    Export (#10980)
    
    * CAMEL-19694: camel-jbang - Export can now configure java package name to 
use for source code
    
    * camel class resolver should be able to scan from root package if you use 
dot as the package name.
    
    * Regen
    
    * camel class resolver should be able to scan from root package if you use 
dot as the package name.
---
 .../camel/impl/engine/BasePackageScanResolver.java |  2 +-
 .../engine/DefaultPackageScanClassResolver.java    |  7 ++++-
 .../engine/DefaultPackageScanResourceResolver.java | 10 ++++--
 .../camel/component/saga/SagaComponentTest.java    |  3 +-
 .../seda/SameSedaQueueSizeAndNoSizeTest.java       | 11 ++++---
 .../component/seda/SedaBlockWhenFullTest.java      |  3 +-
 .../seda/SedaConcurrentConsumersNPEIssueTest.java  | 14 +++++----
 .../seda/SedaDefaultBlockWhenFullTest.java         | 12 ++++----
 .../seda/SedaDefaultUnboundedQueueSizeTest.java    |  5 +--
 .../seda/SedaInOutChainedTimeoutTest.java          |  3 +-
 .../component/seda/SedaInOutWithErrorTest.java     |  3 +-
 .../camel/component/seda/SedaNoConsumerTest.java   | 13 +++++---
 .../camel/component/seda/SedaTimeoutTest.java      |  6 ++--
 .../SedaWaitForTaskCompleteOnCompletionTest.java   |  5 +--
 .../camel/component/timer/TimerEndpointTest.java   |  4 +--
 .../component/timer/TimerWithTimeOptionTest.java   |  6 ++--
 .../validator/ValidatorLazyStartProducerTest.java  |  6 ++--
 .../camel/dsl/jbang/core/commands/Export.java      |  1 +
 .../dsl/jbang/core/commands/ExportBaseCommand.java | 22 +++++++++++--
 .../dsl/jbang/core/commands/ExportCamelMain.java   | 36 ++++++++++++++++------
 .../dsl/jbang/core/commands/ExportQuarkus.java     | 13 +++++---
 .../dsl/jbang/core/commands/ExportSpringBoot.java  | 15 ++++++---
 .../src/main/resources/templates/main.tmpl         |  2 +-
 23 files changed, 135 insertions(+), 67 deletions(-)

diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BasePackageScanResolver.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BasePackageScanResolver.java
index 7d703de948c..30968f2e1f4 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BasePackageScanResolver.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BasePackageScanResolver.java
@@ -137,7 +137,7 @@ public abstract class BasePackageScanResolver extends 
ServiceSupport implements
 
         // If the URL is a jar, the URLClassloader.getResources() seems to 
require a trailing slash.  The
         // trailing slash is harmless for other URLs
-        if (!packageName.endsWith("/")) {
+        if (!packageName.isEmpty() && !packageName.endsWith("/")) {
             packageName = packageName + "/";
         }
         return loader.getResources(packageName);
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
index e5027274903..f3f72b0910b 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
@@ -149,7 +149,12 @@ public class DefaultPackageScanClassResolver extends 
BasePackageScanResolver
     }
 
     protected void find(PackageScanFilter test, String packageName, 
Set<Class<?>> classes) {
-        packageName = packageName.replace('.', '/');
+        // special for root package
+        if (".".equals(packageName)) {
+            packageName = "";
+        } else {
+            packageName = packageName.replace('.', '/');
+        }
 
         Set<ClassLoader> set = getClassLoaders();
 
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
index 6fa8a18eaf9..358030969ad 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
@@ -105,10 +105,16 @@ public class DefaultPackageScanResourceResolver extends 
BasePackageScanResolver
             Set<Resource> resources,
             String subPattern) {
 
-        packageName = packageName.replace('.', '/');
+        // special for root package
+        if (".".equals(packageName)) {
+            packageName = "";
+        } else {
+            packageName = packageName.replace('.', '/');
+        }
+
         // If the URL is a jar, the URLClassloader.getResources() seems to 
require a trailing slash.
         // The trailing slash is harmless for other URLs
-        if (!packageName.endsWith("/")) {
+        if (!packageName.isEmpty() && !packageName.endsWith("/")) {
             packageName = packageName + "/";
         }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/saga/SagaComponentTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/saga/SagaComponentTest.java
index 3861783b385..89eb26f9cab 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/saga/SagaComponentTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/saga/SagaComponentTest.java
@@ -85,7 +85,8 @@ public class SagaComponentTest extends ContextTestSupport {
         MockEndpoint compensated = getMockEndpoint("mock:compensated");
         compensated.expectedMessageCount(1);
 
-        assertThrows(Exception.class, () -> 
template.sendBody("direct:auto-workflow", "auto-compensate"), "Should throw an 
exception");
+        assertThrows(Exception.class, () -> 
template.sendBody("direct:auto-workflow", "auto-compensate"),
+                "Should throw an exception");
 
         completed.assertIsNotSatisfied();
         compensated.assertIsSatisfied();
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueSizeAndNoSizeTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueSizeAndNoSizeTest.java
index cb4d372853a..50ef8e0ddeb 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueSizeAndNoSizeTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SameSedaQueueSizeAndNoSizeTest.java
@@ -36,7 +36,8 @@ public class SameSedaQueueSizeAndNoSizeTest extends 
ContextTestSupport {
             template.sendBody("seda:foo", "" + i);
         }
 
-        CamelExecutionException e = 
assertThrows(CamelExecutionException.class, () -> template.sendBody("seda:foo", 
"Should be full now"), "Should fail");
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.sendBody("seda:foo", "Should be full now"), 
"Should fail");
         IllegalStateException ise = 
assertIsInstanceOf(IllegalStateException.class, e.getCause());
         if (!isJavaVendor("ibm")) {
             assertEquals("Queue full", ise.getMessage());
@@ -45,7 +46,8 @@ public class SameSedaQueueSizeAndNoSizeTest extends 
ContextTestSupport {
 
     @Test
     public void testSameQueueDifferentSize() {
-        ResolveEndpointFailedException e = 
assertThrows(ResolveEndpointFailedException.class, () -> 
template.sendBody("seda:foo?size=200", "Should fail"), "Should fail");
+        ResolveEndpointFailedException e = 
assertThrows(ResolveEndpointFailedException.class,
+                () -> template.sendBody("seda:foo?size=200", "Should fail"), 
"Should fail");
         IllegalArgumentException ise = 
assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
         assertEquals(
                 "Cannot use existing queue seda://foo as the existing queue 
size 100 does not match given queue size 200",
@@ -54,10 +56,11 @@ public class SameSedaQueueSizeAndNoSizeTest extends 
ContextTestSupport {
 
     @Test
     public void testSameQueueDifferentSizeBar() {
-        ResolveEndpointFailedException e = 
assertThrows(ResolveEndpointFailedException.class,() -> 
template.sendBody("seda:bar?size=200", "Should fail"), "Should fail");
+        ResolveEndpointFailedException e = 
assertThrows(ResolveEndpointFailedException.class,
+                () -> template.sendBody("seda:bar?size=200", "Should fail"), 
"Should fail");
         IllegalArgumentException ise = 
assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
         assertEquals("Cannot use existing queue seda://bar as the existing 
queue size " + SedaConstants.QUEUE_SIZE
-                        + " does not match given queue size 200",
+                     + " does not match given queue size 200",
                 ise.getMessage());
     }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java
index 99ac0a0a6d5..a50259eaa37 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java
@@ -71,7 +71,8 @@ public class SedaBlockWhenFullTest extends ContextTestSupport 
{
         assertFalse(seda.isBlockWhenFull(),
                 "Seda Endpoint is not setting the correct default (should be 
false) for \"blockWhenFull\"");
 
-        Exception e = assertThrows(Exception.class, () -> 
sendTwoOverCapacity(DEFAULT_URI, QUEUE_SIZE), "The route didn't fill the queue 
beyond capacity: test class isn't working as intended");
+        Exception e = assertThrows(Exception.class, () -> 
sendTwoOverCapacity(DEFAULT_URI, QUEUE_SIZE),
+                "The route didn't fill the queue beyond capacity: test class 
isn't working as intended");
         assertIsInstanceOf(IllegalStateException.class, e.getCause());
     }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java
index ad7f185ffea..d09c8a18c25 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java
@@ -36,11 +36,12 @@ public class SedaConcurrentConsumersNPEIssueTest extends 
ContextTestSupport {
 
         assertMockEndpointsSatisfied();
 
-        FailedToStartRouteException e = 
assertThrows(FailedToStartRouteException.class, () -> 
context.getRouteController().startRoute("first"),
-                "Should have thrown exception");
+        FailedToStartRouteException e
+                = assertThrows(FailedToStartRouteException.class, () -> 
context.getRouteController().startRoute("first"),
+                        "Should have thrown exception");
 
         assertEquals("Failed to start route first because of Multiple 
consumers for the same endpoint is not allowed:"
-                        + " seda://foo?concurrentConsumers=5",
+                     + " seda://foo?concurrentConsumers=5",
                 e.getMessage());
     }
 
@@ -56,11 +57,12 @@ public class SedaConcurrentConsumersNPEIssueTest extends 
ContextTestSupport {
         // this should be okay
         context.getRouteController().startRoute("third");
 
-        FailedToStartRouteException e = 
assertThrows(FailedToStartRouteException.class, () -> 
context.getRouteController().startRoute("first"),
-                "Should have thrown exception");
+        FailedToStartRouteException e
+                = assertThrows(FailedToStartRouteException.class, () -> 
context.getRouteController().startRoute("first"),
+                        "Should have thrown exception");
 
         assertEquals("Failed to start route first because of Multiple 
consumers for the same endpoint is not allowed:"
-                        + " seda://foo?concurrentConsumers=5",
+                     + " seda://foo?concurrentConsumers=5",
                 e.getMessage());
     }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultBlockWhenFullTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultBlockWhenFullTest.java
index 090be18b1a1..48167cb9d42 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultBlockWhenFullTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultBlockWhenFullTest.java
@@ -24,8 +24,8 @@ import org.junit.jupiter.api.Timeout;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Tests that a Seda component properly set blockWhenFull on endpoints.
@@ -74,12 +74,12 @@ public class SedaDefaultBlockWhenFullTest extends 
ContextTestSupport {
 
     @Test
     public void testSedaDefaultWhenFull() {
-            SedaEndpoint seda = context.getEndpoint(DEFAULT_URI, 
SedaEndpoint.class);
-            assertFalse(seda.isBlockWhenFull(),
-                    "Seda Endpoint is not setting the correct default (should 
be false) for \"blockWhenFull\"");
+        SedaEndpoint seda = context.getEndpoint(DEFAULT_URI, 
SedaEndpoint.class);
+        assertFalse(seda.isBlockWhenFull(),
+                "Seda Endpoint is not setting the correct default (should be 
false) for \"blockWhenFull\"");
 
-            Exception e = assertThrows(Exception.class, () -> 
sendTwoOverCapacity(DEFAULT_URI, QUEUE_SIZE),
-                    "The route didn't fill the queue beyond capacity: test 
class isn't working as intended");
+        Exception e = assertThrows(Exception.class, () -> 
sendTwoOverCapacity(DEFAULT_URI, QUEUE_SIZE),
+                "The route didn't fill the queue beyond capacity: test class 
isn't working as intended");
 
         assertIsInstanceOf(IllegalStateException.class, e.getCause());
     }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultUnboundedQueueSizeTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultUnboundedQueueSizeTest.java
index 1a19890607c..c55361ed030 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultUnboundedQueueSizeTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaDefaultUnboundedQueueSizeTest.java
@@ -19,8 +19,8 @@ package org.apache.camel.component.seda;
 import org.apache.camel.ContextTestSupport;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class SedaDefaultUnboundedQueueSizeTest extends ContextTestSupport {
 
@@ -48,7 +48,8 @@ public class SedaDefaultUnboundedQueueSizeTest extends 
ContextTestSupport {
         assertEquals(500, seda.getQueue().size());
 
         // sending one more hit the limit
-        Exception e = assertThrows(Exception.class, () -> 
template.sendBody("seda:foo", "Message overflow"), "Should thrown an 
exception");
+        Exception e = assertThrows(Exception.class, () -> 
template.sendBody("seda:foo", "Message overflow"),
+                "Should thrown an exception");
         assertIsInstanceOf(IllegalStateException.class, e.getCause());
     }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java
index d12b79d63f5..ae8c2b33f7c 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java
@@ -34,7 +34,8 @@ public class SedaInOutChainedTimeoutTest extends 
ContextTestSupport {
         // time timeout after 2 sec should trigger an immediate reply
         StopWatch watch = new StopWatch();
 
-        CamelExecutionException e = 
assertThrows(CamelExecutionException.class, () -> 
template.requestBody("seda:a?timeout=5000", "Hello World"), "Should have thrown 
an exception");
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.requestBody("seda:a?timeout=5000", "Hello 
World"), "Should have thrown an exception");
         ExchangeTimedOutException cause = 
assertIsInstanceOf(ExchangeTimedOutException.class, e.getCause());
         assertEquals(2000, cause.getTimeout());
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutWithErrorTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutWithErrorTest.java
index 9982f285275..460a07168bc 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutWithErrorTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutWithErrorTest.java
@@ -30,7 +30,8 @@ public class SedaInOutWithErrorTest extends 
ContextTestSupport {
     public void testInOutWithError() throws Exception {
         getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        CamelExecutionException e = 
assertThrows(CamelExecutionException.class, () -> 
template.requestBody("direct:start", "Hello World", String.class),
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.requestBody("direct:start", "Hello World", 
String.class),
                 "Should have thrown an exception");
 
         assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaNoConsumerTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaNoConsumerTest.java
index 66c67fc4e71..c13714b3df2 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaNoConsumerTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaNoConsumerTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.seda;
 
+import java.util.concurrent.TimeUnit;
+
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.ExchangeTimedOutException;
@@ -23,8 +25,6 @@ import org.apache.camel.builder.NotifyBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
 
-import java.util.concurrent.TimeUnit;
-
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -64,7 +64,8 @@ public class SedaNoConsumerTest extends ContextTestSupport {
 
         context.start();
 
-        CamelExecutionException e = 
assertThrows(CamelExecutionException.class, () -> 
template.requestBody("direct:start", "Hello World"), "Should throw an 
exception");
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.requestBody("direct:start", "Hello World"), 
"Should throw an exception");
         assertIsInstanceOf(ExchangeTimedOutException.class, e.getCause());
     }
 
@@ -79,7 +80,8 @@ public class SedaNoConsumerTest extends ContextTestSupport {
 
         context.start();
 
-        CamelExecutionException e = 
assertThrows(CamelExecutionException.class, () -> 
template.sendBody("direct:start", "Hello World"), "Should throw an exception");
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.sendBody("direct:start", "Hello World"), 
"Should throw an exception");
         assertIsInstanceOf(SedaConsumerNotAvailableException.class, 
e.getCause());
     }
 
@@ -124,7 +126,8 @@ public class SedaNoConsumerTest extends ContextTestSupport {
         context.getRouteController().stopRoute("stopThisRoute");
         TimeUnit.MILLISECONDS.sleep(100);
 
-        CamelExecutionException e = 
assertThrows(CamelExecutionException.class, () -> 
template.sendBody("seda:foo?failIfNoConsumers=true", "Hello World"), "Should 
throw an exception");
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.sendBody("seda:foo?failIfNoConsumers=true", 
"Hello World"), "Should throw an exception");
         assertIsInstanceOf(SedaConsumerNotAvailableException.class, 
e.getCause());
     }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaTimeoutTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaTimeoutTest.java
index 29f598ff19f..62bb1f81936 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaTimeoutTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaTimeoutTest.java
@@ -16,15 +16,15 @@
  */
 package org.apache.camel.component.seda;
 
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.ExchangeTimedOutException;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
 
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskCompleteOnCompletionTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskCompleteOnCompletionTest.java
index ce1d421fb46..fd95595cec5 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskCompleteOnCompletionTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskCompleteOnCompletionTest.java
@@ -35,8 +35,9 @@ public class SedaWaitForTaskCompleteOnCompletionTest extends 
ContextTestSupport
     public void testAlways() throws Exception {
         getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        CamelExecutionException e = 
assertThrows(CamelExecutionException.class, () -> 
template.sendBody("direct:start", "Hello World"),
-                "Should have thrown an exception");
+        CamelExecutionException e
+                = assertThrows(CamelExecutionException.class, () -> 
template.sendBody("direct:start", "Hello World"),
+                        "Should have thrown an exception");
 
         assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
         assertEquals("Forced", e.getCause().getMessage());
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerEndpointTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerEndpointTest.java
index 5b6ab042f2b..46dd377c08a 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerEndpointTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerEndpointTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.timer;
 
+import java.util.Timer;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Endpoint;
 import org.apache.camel.RuntimeCamelException;
@@ -24,8 +26,6 @@ import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import java.util.Timer;
-
 public class TimerEndpointTest extends ContextTestSupport {
 
     @Override
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerWithTimeOptionTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerWithTimeOptionTest.java
index 19c57198778..f79e11c709a 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerWithTimeOptionTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/timer/TimerWithTimeOptionTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.component.timer;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.builder.RouteBuilder;
@@ -23,9 +26,6 @@ import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
 public class TimerWithTimeOptionTest extends ContextTestSupport {
 
     @Override
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorLazyStartProducerTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorLazyStartProducerTest.java
index ba46f959b94..36648958eb7 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorLazyStartProducerTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorLazyStartProducerTest.java
@@ -16,12 +16,12 @@
  */
 package org.apache.camel.component.validator;
 
+import java.io.FileNotFoundException;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
 
-import java.io.FileNotFoundException;
-
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class ValidatorLazyStartProducerTest extends ContextTestSupport {
@@ -30,7 +30,7 @@ public class ValidatorLazyStartProducerTest extends 
ContextTestSupport {
     public void testLazyStartProducerFail() throws Exception {
         getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        Exception e = assertThrows(Exception.class, () ->             
template.sendBody("direct:fail",
+        Exception e = assertThrows(Exception.class, () -> 
template.sendBody("direct:fail",
                 "<mail 
xmlns='http://foo.com/bar'><subject>Hey</subject><body>Hello 
world!</body></mail>"),
                 "Should throw exception");
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
index aaeaca73e42..830e36a0b07 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
@@ -120,6 +120,7 @@ public class Export extends ExportBaseCommand {
         cmd.secretsRefresh = this.secretsRefresh;
         cmd.secretsRefreshProviders = this.secretsRefreshProviders;
         cmd.openapi = this.openapi;
+        cmd.packageName = this.packageName;
         // run export
         return cmd.export();
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index 543c47e7d35..bd7df4db115 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -158,6 +158,12 @@ abstract class ExportBaseCommand extends CamelCommand {
     @CommandLine.Option(names = { "--logging-level" }, defaultValue = "info", 
description = "Logging level")
     protected String loggingLevel;
 
+    @CommandLine.Option(names = { "--package-name" },
+                        description = "For Java source files should they have 
the given package name. By default the package name is computed from the Maven 
GAV. "
+                                      +
+                                      "Use false to turn off and not include 
package name in the Java source files.")
+    protected String packageName;
+
     @CommandLine.Option(names = { "--fresh" }, description = "Make sure we use 
fresh (i.e. non-cached) resources")
     protected boolean fresh;
 
@@ -443,8 +449,10 @@ abstract class ExportBaseCommand extends CamelCommand {
                             }
                         } else {
                             fos = new FileOutputStream(out);
-                            lines.add(0, "");
-                            lines.add(0, "package " + packageName + ";");
+                            if (packageName != null && 
!"false".equalsIgnoreCase(packageName)) {
+                                lines.add(0, "");
+                                lines.add(0, "package " + packageName + ";");
+                            }
                         }
                         for (String line : lines) {
                             adjustJavaSourceFileLine(line, fos);
@@ -462,7 +470,15 @@ abstract class ExportBaseCommand extends CamelCommand {
         // noop
     }
 
-    protected String exportPackageName(String groupId, String artifactId) {
+    protected String exportPackageName(String groupId, String artifactId, 
String packageName) {
+        if ("false".equalsIgnoreCase(packageName)) {
+            return null; // package names are turned off (we should use root 
package)
+        }
+        if (packageName != null) {
+            return packageName; // use specific package name
+        }
+
+        // compute package name based on Maven GAV
         // for package name it must be in lower-case and alpha/numeric
         String s = groupId + "." + artifactId;
         StringBuilder sb = new StringBuilder();
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
index 54cc96a053e..9c5d9df7e6d 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
@@ -82,10 +82,15 @@ class ExportCamelMain extends Export {
         FileUtil.removeDir(buildDir);
         buildDir.mkdirs();
 
-        // copy source files
-        String packageName = exportPackageName(ids[0], ids[1]);
+        // compute source folders
         File srcJavaDirRoot = new File(BUILD_DIR, "src/main/java");
-        File srcJavaDir = new File(srcJavaDirRoot, packageName.replace('.', 
File.separatorChar));
+        String srcPackageName = exportPackageName(ids[0], ids[1], packageName);
+        File srcJavaDir;
+        if (srcPackageName == null) {
+            srcJavaDir = srcJavaDirRoot;
+        } else {
+            srcJavaDir = new File(srcJavaDirRoot, srcPackageName.replace('.', 
File.separatorChar));
+        }
         srcJavaDir.mkdirs();
         File srcResourcesDir = new File(BUILD_DIR, "src/main/resources");
         srcResourcesDir.mkdirs();
@@ -93,12 +98,15 @@ class ExportCamelMain extends Export {
         srcCamelResourcesDir.mkdirs();
         File srcKameletsResourcesDir = new File(BUILD_DIR, 
"src/main/resources/kamelets");
         srcKameletsResourcesDir.mkdirs();
+        // copy source files
         copySourceFiles(settings, profile, srcJavaDirRoot, srcJavaDir, 
srcResourcesDir, srcCamelResourcesDir,
-                srcKameletsResourcesDir, packageName);
+                srcKameletsResourcesDir, srcPackageName);
         // copy from settings to profile
         copySettingsAndProfile(settings, profile, srcResourcesDir, prop -> {
-            if (!prop.containsKey("camel.main.basePackageScan") && 
!prop.containsKey("camel.main.base-package-scan")) {
-                prop.put("camel.main.basePackageScan", packageName);
+            if (!prop.containsKey("camel.main.basePackageScan")
+                    && !prop.containsKey("camel.main.base-package-scan")) {
+                // use dot as root package if no package are in use
+                prop.put("camel.main.basePackageScan", srcPackageName == null 
? "." : srcPackageName);
             }
             if (!hasModeline(settings)) {
                 prop.remove("camel.main.modeline");
@@ -117,13 +125,13 @@ class ExportCamelMain extends Export {
             return prop;
         });
         // create main class
-        createMainClassSource(srcJavaDir, packageName, mainClassname);
+        createMainClassSource(srcJavaDir, srcPackageName, mainClassname);
         // gather dependencies
         Set<String> deps = resolveDependencies(settings, profile);
         // copy local lib JARs
         copyLocalLibDependencies(deps);
         if ("maven".equals(buildTool)) {
-            createMavenPom(settings, profile, new File(BUILD_DIR, "pom.xml"), 
deps, packageName);
+            createMavenPom(settings, profile, new File(BUILD_DIR, "pom.xml"), 
deps, srcPackageName);
             if (mavenWrapper) {
                 copyMavenWrapper();
             }
@@ -156,7 +164,11 @@ class ExportCamelMain extends Export {
         context = context.replaceFirst("\\{\\{ \\.Version }}", ids[2]);
         context = context.replaceFirst("\\{\\{ \\.JavaVersion }}", 
javaVersion);
         context = context.replaceAll("\\{\\{ \\.CamelVersion }}", 
camelVersion);
-        context = context.replaceAll("\\{\\{ \\.MainClassname }}", packageName 
+ "." + mainClassname);
+        if (packageName != null) {
+            context = context.replaceAll("\\{\\{ \\.MainClassname }}", 
packageName + "." + mainClassname);
+        } else {
+            context = context.replaceAll("\\{\\{ \\.MainClassname }}", 
mainClassname);
+        }
 
         Properties prop = new CamelCaseOrderedProperties();
         RuntimeUtil.loadProperties(prop, settings);
@@ -307,7 +319,11 @@ class ExportCamelMain extends Export {
         String context = IOHelper.loadText(is);
         IOHelper.close(is);
 
-        context = context.replaceFirst("\\{\\{ \\.PackageName }}", 
packageName);
+        if (packageName != null) {
+            context = context.replaceFirst("\\{\\{ \\.PackageName }}", 
"package " + packageName + ";");
+        } else {
+            context = context.replaceFirst("\\{\\{ \\.PackageName }}", "");
+        }
         context = context.replaceAll("\\{\\{ \\.MainClassname }}", 
mainClassname);
         IOHelper.writeText(context, new FileOutputStream(srcJavaDir + "/" + 
mainClassname + ".java", false));
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
index aa7cc6bce78..c525ff3a1a2 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
@@ -85,10 +85,14 @@ class ExportQuarkus extends Export {
         FileUtil.removeDir(buildDir);
         buildDir.mkdirs();
 
-        // copy source files
-        String packageName = exportPackageName(ids[0], ids[1]);
         File srcJavaDirRoot = new File(BUILD_DIR, "src/main/java");
-        File srcJavaDir = new File(srcJavaDirRoot, packageName.replace('.', 
File.separatorChar));
+        String srcPackageName = exportPackageName(ids[0], ids[1], packageName);
+        File srcJavaDir;
+        if (srcPackageName == null) {
+            srcJavaDir = srcJavaDirRoot;
+        } else {
+            srcJavaDir = new File(srcJavaDirRoot, srcPackageName.replace('.', 
File.separatorChar));
+        }
         srcJavaDir.mkdirs();
         File srcResourcesDir = new File(BUILD_DIR, "src/main/resources");
         srcResourcesDir.mkdirs();
@@ -96,8 +100,9 @@ class ExportQuarkus extends Export {
         srcCamelResourcesDir.mkdirs();
         File srcKameletsResourcesDir = new File(BUILD_DIR, 
"src/main/resources/kamelets");
         srcKameletsResourcesDir.mkdirs();
+        // copy source files
         copySourceFiles(settings, profile, srcJavaDirRoot, srcJavaDir, 
srcResourcesDir, srcCamelResourcesDir,
-                srcKameletsResourcesDir, packageName);
+                srcKameletsResourcesDir, srcPackageName);
         // copy from settings to profile
         copySettingsAndProfile(settings, profile, srcResourcesDir, prop -> {
             if (!hasModeline(settings)) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
index e393f3ef0ea..5c9e5103e7a 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
@@ -86,10 +86,14 @@ class ExportSpringBoot extends Export {
         FileUtil.removeDir(buildDir);
         buildDir.mkdirs();
 
-        // copy source files
-        String packageName = exportPackageName(ids[0], ids[1]);
         File srcJavaDirRoot = new File(BUILD_DIR, "src/main/java");
-        File srcJavaDir = new File(srcJavaDirRoot, packageName.replace('.', 
File.separatorChar));
+        String srcPackageName = exportPackageName(ids[0], ids[1], packageName);
+        File srcJavaDir;
+        if (srcPackageName == null) {
+            srcJavaDir = srcJavaDirRoot;
+        } else {
+            srcJavaDir = new File(srcJavaDirRoot, srcPackageName.replace('.', 
File.separatorChar));
+        }
         srcJavaDir.mkdirs();
         File srcResourcesDir = new File(BUILD_DIR, "src/main/resources");
         srcResourcesDir.mkdirs();
@@ -97,8 +101,9 @@ class ExportSpringBoot extends Export {
         srcCamelResourcesDir.mkdirs();
         File srcKameletsResourcesDir = new File(BUILD_DIR, 
"src/main/resources/kamelets");
         srcKameletsResourcesDir.mkdirs();
+        // copy source files
         copySourceFiles(settings, profile, srcJavaDirRoot, srcJavaDir, 
srcResourcesDir, srcCamelResourcesDir,
-                srcKameletsResourcesDir, packageName);
+                srcKameletsResourcesDir, srcPackageName);
         // copy from settings to profile
         copySettingsAndProfile(settings, profile, srcResourcesDir, prop -> {
             if (!hasModeline(settings)) {
@@ -107,7 +112,7 @@ class ExportSpringBoot extends Export {
             return prop;
         });
         // create main class
-        createMainClassSource(srcJavaDir, packageName, mainClassname);
+        createMainClassSource(srcJavaDir, srcPackageName, mainClassname);
         // gather dependencies
         Set<String> deps = resolveDependencies(settings, profile);
         // copy local lib JARs
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main.tmpl 
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main.tmpl
index bf0bf30cd3c..52e141843ca 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main.tmpl
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main.tmpl
@@ -1,4 +1,4 @@
-package {{ .PackageName }};
+{{ .PackageName }}
 
 import org.apache.camel.main.Main;
 


Reply via email to