当前位置: 首页 > 知识库问答 >
问题:

使用gradle/Clojuresq构建Clojure

乔宏峻
2023-03-14

我正在尝试使用gradle/Clojuresque来构建clojure代码,运行它,并获得uberjar。我使用来自http://dev.clojure.org/display/doc/Getting从Gradle开始,https://bitbucket.org/kotarak/clojuresque/wiki/Getting开始了,但“找不到我们”。bpsm:ednjava:0.4。Clojure(Clojuresque)的Gradle出现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" }
}

gradle build任务,没有错误,我有一个jar文件,但我没有看到任何生成的类文件;我不认为生成的jar包含任何东西,特别是当我比较从手动构建的结果(编译Clojure源代码到类(AOT)从命令行(不使用lein))。

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

这是核心。clj

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

什么可能是错的?此外,如何运行代码并获得uberjar像lein runlein uberjar

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

共有2个答案

栾越
2023-03-14

您缺少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。cljsrc/main/clojure默认情况下gradle会在其中查找源。通过这些更改,jar文件被生成,并且可以在提供有效的cp时运行——我没有安装clojure,所以无法轻松检查它。

编辑

这里可以找到一个示例项目,它包含了我介绍的所有更改。它还生成带有shadowJar任务的uber jar,该任务内置clojure依赖项,并可以启用hello。要使用以下命令运行的核心

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

编辑2

现在,github示例生成了可运行的jar。

柯瀚海
2023-03-14

源代码应该位于./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将生成类文件

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

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

我不确定设置是否十分必要gradlejar将生成jar文件。

这是运行代码的命令:

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

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

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

apply plugin: 'application'

uberjar.enabled = true

现在只需要一个罐子就可以执行了

clojure_test> java -jar build/libs/clojure_test-standalone.jar 
Hello, World!
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脚本。它包含设置Main类的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'

去拿ubjer罐子

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
  • 用Gradle建造一个uberjar
 类似资料:
  • 问题内容: 我是Gradle新手。我想构建一个uberjar(AKA fatjar),其中包括项目的所有传递依赖项。我需要在“ build.gradle”中添加哪些行? 这是我目前拥有的:(我是从几天前的某个地方复制的,但是不要从那里收集。) 问题答案: 您是否尝试过 gradle食谱中 的fatjar示例? 您正在寻找的是gradle 的影子插件

  • 问题内容: 是否有任何Gradle教程或插件显示如何借助Gradle构建来构建/分发Eclipse插件? Somethig类似于Maven的Tycho项目:http ://eclipse.org/tycho/ ? 问题答案: 我不知道是否存在与Tycho相当的插件。请参阅此Gradle论坛条目以获取相关讨论。

  • 我尝试使用gradle构建工具构建一个简单的android应用程序。但是我得到了这样的错误 方法无签名:org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.compile()适用于参数类型:(java.lang.String)值:[org.gradle.api.plugins: gradle and

  • 问题内容: 我正在尝试从build.gradle文件中运行Groovy类。我遵循使用指南中的指示,但是出现错误。 构建文件为: 常规类很简单: 但是,当我尝试运行gradlew编译fooTask时,出现以下错误: 无法解析类groovyClass 知道为什么吗? 谢谢 问题答案: 如果要从构建中引用它,则需要添加该类(而不是在简单的Exec任务中)。给定此目录结构: 在哪里: 并且是: 然后,运行

  • 问题内容: 我正在使用gradle构建的开源项目。我想生成一个(project)-sources.jar文件,可以将其加载到我的IDE(IntelliJ IDEA)中并通过该项目进行调试。我知道如何生成文件(如果可以生成的话)。 我浏览了该项目可用的gradle任务,但没有一个可以生成source jar文件。 为该项目生成源jar文件的最简单方法是什么? 将源添加到包含已编译的类文件的jar文件

  • 我试图在Eclipse的Java中构建一个Apache Spark应用程序。我使用Gradle作为我的构建管理系统。我应该在中写什么?我应该使用哪些gradle命令来做这个Maven POM和终端命令所做的同样的事情? 和