Skip to content

Instantly share code, notes, and snippets.

@antiqueeverett
Last active June 13, 2020 06:53
Show Gist options
  • Select an option

  • Save antiqueeverett/0e948e523ed72dd70f3ef613af83d97d to your computer and use it in GitHub Desktop.

Select an option

Save antiqueeverett/0e948e523ed72dd70f3ef613af83d97d to your computer and use it in GitHub Desktop.
How to gradle run a java project that invokes clojure
  • create a clojure project using leiningen $ lein new <project>

  • create a run.sh script and build.gradle file

  • create a lib directory and put the clojure-1.10.1.jar in the directory

<project>/
│
├── run.sh (create file)
│
├── project.clj (created by lein)
│
├── build.gradle (create file)
│
├── libs/ (created dir)
│   └── clojure-1.10.1.jar 
│  
├── src/ (created by lein)
│   └── packagename 
│       ├── Main.java
│       └── core.clj
│  
├── build/ (created by gradle)
│  
├── target/ (created by lein)
│ 
└── test/ (created by lein)

inside run.sh

#!/usr/bin/env bash

runLein(){
    echo "running lein project ..."
    lein clean &>/dev/null
    lein compile &>/dev/null
    lein uberjar &>/dev/null
}

runGradle(){
    echo "running gradle tasks..."
    gradle clean
    gradle build
    gradle run 
}

runLein;
runGradle;

exit 0

inside gradle.build

apply plugin: 'java'


sourceSets{
    main.java.srcDir 'src'
}


jar{
    manifest.attributes 'Main-Class': 'packagename.Main'
}


repositories {
    flatDir {
        dirs 'libs'
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
        implementation fileTree(dir: 'libs', include: '*.jar')
}


task run(type: JavaExec){
    main = 'packagename.Main'
        classpath = files('lib/clojure-1.10.1.jar')
        classpath += files('target/clojure-functions-1.1.1.jar')
        classpath += sourceSets.main.runtimeClasspath
}

inside project.clj

(defproject clojure-functions "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.10.0"]]
  :repl-options {:init-ns packagename.core}
  :main packagename.core
  :aot [packagename.core]
  )

inside core.clj

(ns packagename.core   ;; name space
  (:gen-class))             

(defn hello-world []
  (print "Hello World"))


(defn -main [name]
  "...just another main"
  (println "... lets get started!"))

inside Main.java

package packagename;
import clojure.java.api.Clojure;
import clojure.lang.IFn;

public class Main{
    public static void main(String[] args) throws Exception{
        // clojure-code namespace
        IFn require = Clojure.var("clojure.core", "require");
        require.invoke(Clojure.read("packagename.core"));

        IFn hello_world  = Clojure.var("packagename.core", "hello-world");
        System.out.println(hello_world.invoke());
    }
}

finally,

$ sudo chmod +x run.sh
$ ./run.sh
  • the terminal should display
> Task :run
Hello World
null
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment