使用 gradle/clojuresq 构建 clojure

Using gradle/clojuresq to build clojure

我正在尝试使用 gradle/Clojuresque 构建 clojure 代码,运行 它,并获取 uberjar。 我使用来自 http://dev.clojure.org/display/doc/Getting+Started+with+Gradle, https://bitbucket.org/kotarak/clojuresque/wiki/Getting%20Started, and 的提示。

这是成绩脚本。

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" }
}

使用 gradle build 任务,没有错误,我有一个 jar 文件,但我没有看到任何生成的 class 文件;我不认为生成的 jar 包含任何内容,尤其是当我比较手动构建的结果时 ()。

.
├── build
│   ├── libs
│   │   └── clojure.jar
│   └── tmp
│       └── jar
│           └── MANIFEST.MF
├── build.gradle
└── src
    └── hello
        └── core.clj

这是core.clj

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

可能出了什么问题?另外,如何 运行 代码并获得像 lein runlein uberjar 那样的 uberjar?

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

创建 class 个文件

源代码应位于 ./src/main/clojure,因为它是默认目录。

虽然可以在 gradle 文件中指定源文件。

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

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

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

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

gradle build 将生成 class 个文件。

获取jar文件

我们需要为 jar 文件设置主要 class。

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

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

执行jar文件

这是 运行 代码的命令:

java -cp .:<PATH>/clojure-1.6.0.jar:build/libs/clojure_test.jar hello.core

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

执行 uberjar

现在只有一个 jar 用于执行

clojure_test> java -jar build/libs/clojure_test-standalone.jar 
Hello, World!

新建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

影子罐

根据 Opal 的回答,我添加了 gradle 创建 shadowJar 的脚本。它包含设置 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" 
}

或者使用这两行代码代替清单更改代码:

apply plugin: 'application'
mainClassName = 'hello.core'

执行影子 jar

获取 ubjer jar

gradle shadow

和uberjar一样。

clojure_test> java -jar build/libs/clojure_test-all.jar 
Hello, World!

参考资料

您缺少 Maven 中央存储库:

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" }
    mavenCentral()
}

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

并且你们都修改 gradle 源集或将 hello/core.clj 移动到 src/main/clojure,其中 gradle 默认查找源。通过这些更改,生成了 jar 文件,并且在提供有效 cp 时可以 运行 - 我没有安装 clojure,因此无法轻松检查它。

编辑

Here 可以找到一个示例项目,其中包含我介绍的所有更改。它还会生成带有 shadowJar 任务的 uber jar,该任务内置了 clojure 依赖项,并且可以使用以下命令使 hello.core 成为 运行:

java -cp build/libs/29015575-all.jar hello.core 

EDIT2

现在 github 示例生成 运行nable jar。