使用 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 run
和 lein 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!
参考资料
- https://github.com/johnrengelman/shadow
- 锅炉板 - https://github.com/DevonStrawn/Clojuresque-Boilerplate
- Building a uberjar with Gradle
您缺少 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。
我正在尝试使用 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 run
和 lein 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!
参考资料
- https://github.com/johnrengelman/shadow
- 锅炉板 - https://github.com/DevonStrawn/Clojuresque-Boilerplate
- Building a uberjar with Gradle
您缺少 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。