Calling Clojure from Java using a real example (Clojure Quarkus)

The challenge
Last weekend, I decided to explore more about how Clojure can interact with the existent Java ecosystem, the challenge was simple:
Create a simple web framework in Clojure using the Quarkus framework as a base.
Premises:
- The Quarkus does not know what will be executed by route, even not how many routes exist.
- I should be able to create routes and handlers using Clojure as simply as possible:
(defn send-hello-world [] "Hello World")
(defn routes [] [{:method "GET"
:path "/hello"
:handler send-hello-world}])
Some definitions:
- Quarkus: Quarkus is a full-stack, Kubernetes-native Java framework made for Java virtual machines (JVMs) and native compilation, optimizing Java specifically for containers.
- Clojure: Is a dynamic, general-purpose programming language
Step 1: Creating a Quarkus app
It is very easy to start an app in Quarkus you can follow this tutorial, as you can see your last command will be quarkus create && cd code-with-quarkus after that you can open the folder code-with-quarkus with your favorite IDE, the command created the basic structure of a Quarkus app, and you can run with quarkus dev
Step 2: Enable the project to recognize clj files
You need to configure Quarkus to include .clj files in target folder (The folder with your compiled app), and you can do it by adding this configuration in pom.xml inside
<resources>
<resource>
<directory>/</directory>
<includes>
<include>*.clj</include>
</includes>
</resource>
</resources>
Step 3: Create Clojure file
As I mentioned earlier, I defined one structure to declare my routes, in the same location of the folder main. Then I created a folder named quarkus_clj with a file called core with the code below:
(ns quarkus-clj.core)
(defn send-hello-world [] "Hello World")
(defn routes [] [{:method "GET"
:path "/hello"
:handler send-hello-world}])
Step 4: Enabling Quarkus to handle my Clojure program
Here is where the magic happens ??!
First of all, you should install the Clojure inside your Quarkus app; you can do it by adding a dependency in pom.xml
<dependency>
<groupId>org.clojure</groupId>
<artifactId>clojure</artifactId>
<version>1.11.1</version>
</dependency>
Now, you can delete the file GreetingResource.java and its tests. In the same place, create a file Starting.java
I write some comments explaining how it works
@ApplicationScoped
public class Starting {
//Setup app routes
public void setupRouter(@Observes Router router) {
// Load Clojure core;
IFn require = Clojure.var("clojure.core", "require");
// Load quarkus-clj.core namespace
require.invoke(Clojure.read("quarkus-clj.core"));
// Load the route list function
IFn routesFn = Clojure.var("quarkus-clj.core", "route");
// Invoke the function with no parameters
PersistentVector routesVector = (PersistentVector) routesFn.invoke();
//For each route in routes vector
for (Object route : routesVector) {
/**Get the route map, example
{:method "GET"
:path "/hello"
:handler send-hello-world}
*/
PersistentArrayMap routeMap = (PersistentArrayMap) route;
//Get :path value
String path = (String) routeMap.valAt(Clojure.read(":path"));
//Get :handler function
IFn handlerRoute = (IFn) routeMap.valAt(Clojure.read(":handler"));
//Get :method value
String method = (String) routeMap.valAt(Clojure.read(":method"));
//Create a handler to exec handler function
Handler<RoutingContext> handlerFn = (RoutingContext context) -> {
String result = (String) handlerRoute.invoke();
context.response().end(result);
};
//Config the route in quarkus
router.route(HttpMethod.valueOf(method), path).handler(handlerFn);
}
}
}
Now you can just run: quarkus dev open your declared route and see the result!
Conclusion
This was a quick example of how to use Clojure inside a Quarkus app to create dynamic routes. With just a few steps, we connected the two ecosystems and set up a basic routing system. Feel free to expand on this foundation and explore other possibilities with Clojure and Quarkus!
The above is the detailed content of Calling Clojure from Java using a real example (Clojure Quarkus). For more information, please follow other related articles on the PHP Chinese website!
Hot AI Tools
Undress AI Tool
Undress images for free
Undresser.AI Undress
AI-powered app for creating realistic nude photos
AI Clothes Remover
Online AI tool for removing clothes from photos.
Clothoff.io
AI clothes remover
Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!
Hot Article
Hot Tools
Notepad++7.3.1
Easy-to-use and free code editor
SublimeText3 Chinese version
Chinese version, very easy to use
Zend Studio 13.0.1
Powerful PHP integrated development environment
Dreamweaver CS6
Visual web development tools
SublimeText3 Mac version
God-level code editing software (SublimeText3)
Comparing Java Frameworks: Spring Boot vs Quarkus vs Micronaut
Aug 04, 2025 pm 12:48 PM
Pre-formanceTartuptimeMoryusage, Quarkusandmicronautleadduetocompile-Timeprocessingandgraalvsupport, Withquarkusoftenperforminglightbetterine ServerLess scenarios.2.Thyvelopecosyste,
What is a deadlock in Java and how can you prevent it?
Aug 23, 2025 pm 12:55 PM
AdeadlockinJavaoccurswhentwoormorethreadsareblockedforever,eachwaitingforaresourceheldbytheother,typicallyduetocircularwaitcausedbyinconsistentlockordering;thiscanbepreventedbybreakingoneofthefournecessaryconditions—mutualexclusion,holdandwait,nopree
How to join an array of strings in Java?
Aug 04, 2025 pm 12:55 PM
Using String.join() (Java8) is the easiest recommended method for connecting string arrays, just specify the separator directly; 2. For old versions of Java or when more control is needed, you can use StringBuilder to manually traverse and splice; 3. StringJoiner is suitable for scenarios that require more flexible formats such as prefixes and suffixes; 4. Using Arrays.stream() combined with Collectors.joining() is suitable for filtering or converting the array before joining; To sum up, if Java8 and above is used, the String.join() method should be preferred in most cases, which is concise and easy to read, but for complex logic, it is recommended.
How to implement a simple TCP client in Java?
Aug 08, 2025 pm 03:56 PM
Importjava.ioandjava.net.SocketforI/Oandsocketcommunication.2.CreateaSocketobjecttoconnecttotheserverusinghostnameandport.3.UsePrintWritertosenddataviaoutputstreamandBufferedReadertoreadserverresponsesfrominputstream.4.Usetry-with-resourcestoautomati
How to compare two strings in Java?
Aug 04, 2025 am 11:03 AM
Use the .equals() method to compare string content, because == only compare object references rather than content; 1. Use .equals() to compare string values equally; 2. Use .equalsIgnoreCase() to compare case ignoring; 3. Use .compareTo() to compare strings in dictionary order, returning 0, negative or positive numbers; 4. Use .compareToIgnoreCase() to compare case ignoring; 5. Use Objects.equals() or safe call method to process null strings to avoid null pointer exceptions. In short, you should avoid using == for string content comparisons unless it is explicitly necessary to check whether the object is in phase.
How to send and receive messages over a WebSocket in Java
Aug 16, 2025 am 10:36 AM
Create a WebSocket server endpoint to define the path using @ServerEndpoint, and handle connections, message reception, closing and errors through @OnOpen, @OnMessage, @OnClose and @OnError; 2. Ensure that javax.websocket-api dependencies are introduced during deployment and automatically registered by the container; 3. The Java client obtains WebSocketContainer through the ContainerProvider, calls connectToServer to connect to the server, and receives messages using @ClientEndpoint annotation class; 4. Use the Session getBasicRe
Correct posture for handling non-UTF-8 request encoding in Spring Boot application
Aug 15, 2025 pm 12:30 PM
This article discusses the mechanism and common misunderstandings of Spring Boot applications for handling non-UTF-8 request encoding. The core lies in understanding the importance of the charset parameter in the HTTP Content-Type header, as well as the default character set processing flow of Spring Boot. By analyzing the garbled code caused by wrong testing methods, the article guides readers how to correctly simulate and test requests for different encodings, and explains that Spring Boot usually does not require complex configurations to achieve compatibility under the premise that the client correctly declares encoding.
Exploring Common Java Design Patterns with Examples
Aug 17, 2025 am 11:54 AM
The Java design pattern is a reusable solution to common software design problems. 1. The Singleton mode ensures that there is only one instance of a class, which is suitable for database connection pooling or configuration management; 2. The Factory mode decouples object creation, and objects such as payment methods are generated through factory classes; 3. The Observer mode automatically notifies dependent objects, suitable for event-driven systems such as weather updates; 4. The dynamic switching algorithm of Strategy mode such as sorting strategies improves code flexibility. These patterns improve code maintainability and scalability but should avoid overuse.


