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 run和lein 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
{
manifest.attributes("Main-Class": "hello.core")
}
Run Code Online (Sandbox Code Playgroud)
我不确定设置是否非常必要; gradle jar将生成jar文件.
这是运行代码的命令:
java -cp .:<PATH>/clojure-1.6.0.jar:build/libs/clojure_test.jar hello.core
Run Code Online (Sandbox Code Playgroud)
需要进行三项修改:来自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)
现在只需一个jar来执行
clojure_test> java -jar build/libs/clojure_test-standalone.jar
Hello, World!
Run Code Online (Sandbox Code Playgroud)
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)
获取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)
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |