From 3c16b9c3d4a4e2af809bee8f1ab01ba3742f5143 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 23 Mar 2026 14:14:45 +0100 Subject: [PATCH 1/2] CAMEL-21913: jbang - make JPA easier to use and export - Auto-download Hibernate ORM as JPA provider when jpa component is resolved - Add Hibernate to known dependencies for automatic class resolution - Auto-include Hibernate in exported projects when camel-jpa is used - Map Hibernate to quarkus-hibernate-orm extension for Quarkus export Co-Authored-By: Claude Opus 4.6 --- .../camel/dsl/jbang/core/commands/ExportBaseCommand.java | 5 +++++ .../src/main/resources/quarkus-dependencies.properties | 1 + .../download/DependencyDownloaderComponentResolver.java | 6 ++++++ .../main/resources/camel-main-known-dependencies.properties | 1 + 4 files changed, 13 insertions(+) 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 a45d4b79b0889..060769e4fa06a 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 @@ -705,6 +705,11 @@ protected Set resolveDependencies(Path settings, Path profile) throws Ex } } + // automatic add hibernate as JPA provider when using camel-jpa + if (answer.stream().anyMatch(s -> s.contains("camel-jpa") || s.equals("camel:jpa"))) { + answer.add("mvn:org.hibernate.orm:hibernate-core"); + } + // remove duplicate versions (keep first) Map versions = new HashMap<>(); Set toBeRemoved = new HashSet<>(); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-dependencies.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-dependencies.properties index f9eca1b8d5d70..d85aba89f0324 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-dependencies.properties +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-dependencies.properties @@ -16,4 +16,5 @@ ## --------------------------------------------------------------------------- org.messaginghub\:pooled-jms = io.quarkiverse.messaginghub:quarkus-pooled-jms +org.hibernate.orm\:hibernate-core = io.quarkus:quarkus-hibernate-orm camel\:resilience4j = org.apache.camel.quarkus:camel-quarkus-microprofile-fault-tolerance \ No newline at end of file diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java index e9ae59772898a..3dc0847b11f08 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java @@ -108,6 +108,12 @@ public Component resolveComponent(String name, CamelContext context) { downloadLoader(quartz.getGroupId(), quartz.getArtifactId(), quartz.getVersion()); } } + if ("jpa".equals(name)) { + // include hibernate as JPA provider + if (!downloader.alreadyOnClasspath("org.hibernate.orm", "hibernate-core", null)) { + downloader.downloadDependency("org.hibernate.orm", "hibernate-core", "${hibernate-version}"); + } + } if ("activemq".equals(name) || "activemq6".equals(name)) { // need to include JMS connection-pool (trigger class loader to download correct JAR) try { diff --git a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties index db13dca8e21ee..6ae3173c5fcb8 100644 --- a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties +++ b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties @@ -55,6 +55,7 @@ com.microsoft.sqlserver.jdbc.SQLServerDriver = com.microsoft.sqlserver:mssql-jdb com.mysql.cj.jdbc.Driver = com.mysql:mysql-connector-j:${debezium-mysql-connector-version} com.zaxxer.hikari.HikariDataSource = com.zaxxer:HikariCP:6.3.0 net.sf.saxon.xpath.XPathFactoryImpl = camel:saxon +org.hibernate = org.hibernate.orm:hibernate-core:${hibernate-version} oracle.jdbc.driver.OracleDriver = com.oracle.database.jdbc:ojdbc17:23.8.0.25.04 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory = org.apache.activemq:artemis-jakarta-client-all:${activemq-artemis-version} org.apache.camel.component.activemq.ActiveMQComponent\:embedded\=true = org.apache.activemq:activemq-broker:${activemq-version} From 74ff7d0fc8329f977fca0ffe6574ac3608e372ae Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 23 Mar 2026 14:19:15 +0100 Subject: [PATCH 2/2] CAMEL-21913: Review fixes - remove overly broad known dep, add test - Remove org.hibernate known-dependency prefix (too broad, would match org.hibernate.validator). DependencyDownloaderComponentResolver already handles Hibernate download for JPA component. - Add shouldExportWithJpaAndHibernate test verifying Hibernate is included in exports for all runtimes (main, Spring Boot, Quarkus). Co-Authored-By: Claude Opus 4.6 --- .../dsl/jbang/core/commands/ExportTest.java | 29 +++++++++++++++++++ .../camel-main-known-dependencies.properties | 1 - 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java index 9689bbd50d5a6..f5d2e31ad1ba9 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java +++ b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java @@ -188,6 +188,35 @@ private Export createCommand(RuntimeType rt, String[] files, String... args) { return command; } + @ParameterizedTest + @MethodSource("runtimeProvider") + public void shouldExportWithJpaAndHibernate(RuntimeType rt) throws Exception { + LOG.info("shouldExportWithJpaAndHibernate {}", rt); + Export command = new Export(new CamelJBangMain()); + CommandLine.populateCommand(command, "--gav=examples:route:1.0.0", "--dir=" + workingDir, + "--runtime=%s".formatted(rt.runtime()), "--dep=camel:jpa", "target/test-classes/route.yaml"); + int exit = command.doCall(); + + Assertions.assertEquals(0, exit); + Model model = readMavenModel(); + + if (rt == RuntimeType.main) { + Assertions.assertTrue(containsDependency(model.getDependencies(), "org.apache.camel", "camel-jpa", null)); + Assertions.assertTrue( + containsDependency(model.getDependencies(), "org.hibernate.orm", "hibernate-core", null)); + } else if (rt == RuntimeType.springBoot) { + Assertions.assertTrue( + containsDependency(model.getDependencies(), "org.apache.camel.springboot", "camel-jpa-starter", null)); + Assertions.assertTrue( + containsDependency(model.getDependencies(), "org.hibernate.orm", "hibernate-core", null)); + } else if (rt == RuntimeType.quarkus) { + Assertions.assertTrue( + containsDependency(model.getDependencies(), "org.apache.camel.quarkus", "camel-quarkus-jpa", null)); + Assertions.assertTrue( + containsDependency(model.getDependencies(), "io.quarkus", "quarkus-hibernate-orm", null)); + } + } + @ParameterizedTest @MethodSource("runtimeProvider") public void shouldExportLazyBean(RuntimeType rt) throws Exception { diff --git a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties index 6ae3173c5fcb8..db13dca8e21ee 100644 --- a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties +++ b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties @@ -55,7 +55,6 @@ com.microsoft.sqlserver.jdbc.SQLServerDriver = com.microsoft.sqlserver:mssql-jdb com.mysql.cj.jdbc.Driver = com.mysql:mysql-connector-j:${debezium-mysql-connector-version} com.zaxxer.hikari.HikariDataSource = com.zaxxer:HikariCP:6.3.0 net.sf.saxon.xpath.XPathFactoryImpl = camel:saxon -org.hibernate = org.hibernate.orm:hibernate-core:${hibernate-version} oracle.jdbc.driver.OracleDriver = com.oracle.database.jdbc:ojdbc17:23.8.0.25.04 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory = org.apache.activemq:artemis-jakarta-client-all:${activemq-artemis-version} org.apache.camel.component.activemq.ActiveMQComponent\:embedded\=true = org.apache.activemq:activemq-broker:${activemq-version}