使用gradle/clojuresq构建clojure

pro*_*eek 4 jar clojure gradle clojuresque

我正在尝试使用gradle/Clojuresque来构建clojure代码,运行它,并获得uberjar.我使用提示从http://dev.clojure.org/display/doc/Getting+Started+with+Gradle,https://bitbucket.org/kotarak/clojuresque/wiki/Getting%20Started"无法找到我们Grab for Clojure(Clojuresque)的.bpsm:edn-java:0.4.3'错误.

这是成绩脚本.

buildscript {
    repositories { 
        maven { url "http://clojars.org/repo" } 
        mavenCentral()
    }
    dependencies {
        classpath "clojuresque:clojuresque:1.7.0" 
    }
}

apply plugin: 'clojure'

clojure.aotCompile = true

repositories {
    flatDir dirs: project.file("lib/runtime")
    maven { url "http://clojars.org/repo" }
}
Run Code Online (Sandbox Code Playgroud)

有了gradle buildtask,没有错误,我有一个jar文件,但是我没有看到生成的任何类文件; 我不认为生成的jar什么都不包含,特别是当我比较手动构建的结果时(从命令行编译clojure源到类(AOT)(不使用lein)).

.
??? build
?   ??? libs
?   ?   ??? clojure.jar
?   ??? tmp
?       ??? jar
?           ??? MANIFEST.MF
??? build.gradle
??? src
    ??? hello
        ??? core.clj
Run Code Online (Sandbox Code Playgroud)

这是core.clj

(ns hello.core
  (:gen-class))
(defn -main
  "This should be pretty simple."
  []
  (println "Hello, World!"))
Run Code Online (Sandbox Code Playgroud)

可能有什么问题?此外,如何运行代码并获得uberjar喜欢lein runlein uberjar做什么?

我在https://dl.dropboxusercontent.com/u/10773282/share/2015/clojure_test.zip中压缩了目录

pro*_*eek 11

创建类文件

源代码应该位于./src/main/clojure默认目录中.

但是,可以在gradle文件中指定源文件.

sourceSets {
    main {
        clojure {
            srcDirs = ['src']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个问题是缺少依赖项:

repositories {
    maven { url "http://clojars.org/repo" }
    mavenCentral()
}

dependencies {
    compile "org.clojure:clojure:1.6.0"
}
Run Code Online (Sandbox Code Playgroud)

gradle build 将生成类文件.

获取jar文件

我们需要为jar文件设置主类.

jar
{
    manifest.attributes("Main-Class": "hello.core")
}
Run Code Online (Sandbox Code Playgroud)

我不确定设置是否非常必要; gradle jar将生成jar文件.

执行jar文件

这是运行代码的命令:

java -cp .:<PATH>/clojure-1.6.0.jar:build/libs/clojure_test.jar hello.core
Run Code Online (Sandbox Code Playgroud)

uberjar

需要进行三项修改:来自https://github.com/DevonStrawn/Clojuresque-Boilerplate/blob/master/UberJar/build.gradle的提示.

uberjar
{
    manifest.attributes("Main-Class": "hello.core")
}

apply plugin: 'application'

uberjar.enabled = true
Run Code Online (Sandbox Code Playgroud)

执行uberjar

现在只需一个jar来执行

clojure_test> java -jar build/libs/clojure_test-standalone.jar 
Hello, World!
Run Code Online (Sandbox Code Playgroud)

新的build.gradle文件

buildscript {
    repositories { 
        maven { url "http://clojars.org/repo" } 
        mavenCentral()
    }
    dependencies {
        classpath "clojuresque:clojuresque:1.7.0" 
    }
}

apply plugin: 'clojure'

clojure.aotCompile = true

sourceSets {
    main {
        clojure {
            srcDirs = ['src']
        }
    }
}

repositories {
    maven { url "http://clojars.org/repo" }
    mavenCentral()
}

dependencies {
    compile "org.clojure:clojure:1.7.0"
}

jar
{
    manifest.attributes("Main-Class": "hello.core")
}   

uberjar
{
    manifest.attributes("Main-Class": "hello.core")
}

apply plugin: 'application'

uberjar.enabled = true
Run Code Online (Sandbox Code Playgroud)

影子罐子

根据Opal的回答,我添加了创建shadowJar的gradle脚本.它包含设置Main-Class的MAINFEST文件.

buildscript {
    repositories { 
        maven { url "http://clojars.org/repo" } 
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath "clojuresque:clojuresque:1.7.0" 
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.0'
    }
}

apply plugin: 'application'
apply plugin: 'clojure'
apply plugin: 'com.github.johnrengelman.shadow'

clojure.aotCompile = true
mainClassName = 'hello.core'

sourceSets {
    main {
        clojure {
            srcDirs = ['src']
        }
    }
}

repositories {
    maven { url "http://clojars.org/repo" }
    mavenCentral()
}

dependencies {
    compile "org.clojure:clojure:1.7.0" 
}
Run Code Online (Sandbox Code Playgroud)

或者使用这两行代码而不是清单更改代码:

apply plugin: 'application'
mainClassName = 'hello.core'
Run Code Online (Sandbox Code Playgroud)

执行影子jar

获取ubjer jar

gradle shadow
Run Code Online (Sandbox Code Playgroud)

它和uberjar一样.

clojure_test> java -jar build/libs/clojure_test-all.jar 
Hello, World!
Run Code Online (Sandbox Code Playgroud)

参考