如何在gradle中复制依赖项库JAR

时间:2013-02-03 05:36:33

标签: copy dependencies gradle

我使用此build.gradle获得了一个可运行的jar

apply plugin: 'java'
apply plugin: 'application'

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")

repositories {
    mavenCentral()
}

dependencies {
    compile (
        'commons-codec:commons-codec:1.6',
        'commons-logging:commons-logging:1.1.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpcore:4.2.1',
        'org.apache.httpcomponents:httpmime:4.2.1',
        'ch.qos.logback:logback-classic:1.0.6',
        'ch.qos.logback:logback-core:1.0.6',
        'org.slf4j:slf4j-api:1.6.0',
        'junit:junit:4.+'
    )
}

但它运行失败,因为依赖项jar无法找到。

然后我添加此代码:

task copyToLib(type: Copy) {
    into "$buildDir/output/libs"
    from configurations.runtime
}

但没有变化......我找不到文件夹输出/ libs ...

如何将依赖项libs jar复制到指定的文件夹或路径?

6 个答案:

答案 0 :(得分:39)

添加:

build.dependsOn(copyToLib)

gradle build运行时,Gradle会构建任务以及依赖它的任何任务(由dependsOn声明)。如果不设置build.dependsOn(copyToLib),Gradle将不会将复制任务与构建任务相关联。

所以:

apply plugin: 'java'
apply plugin: 'application'

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")

repositories {
    mavenCentral()
}

dependencies {
    compile (
        'commons-codec:commons-codec:1.6',
        'commons-logging:commons-logging:1.1.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpcore:4.2.1',
        'org.apache.httpcomponents:httpmime:4.2.1',
        'ch.qos.logback:logback-classic:1.0.6',
        'ch.qos.logback:logback-core:1.0.6',
        'org.slf4j:slf4j-api:1.6.0',
        'junit:junit:4.+'
    )
}

task copyToLib(type: Copy) {
    into "$buildDir/output/libs"
    from configurations.runtime
}

build.dependsOn(copyToLib)

答案 1 :(得分:15)

我发现应用程序插件在输出中过于繁琐且过于冗长。这是我最终得到一个我很满意的设置,即在子目录/lib中创建一个包含依赖项jars的分发zip文件,并将所有依赖项添加到清单文件中的Class-Path条目:

apply plugin: 'java'
apply plugin: 'java-library-distribution'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.apache.commons:commons-lang3:3.3.2'
}

// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)

jar {
    // Keep jar clean:
    exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'

    manifest {
        attributes 'Main-Class': 'com.somepackage.MainClass',
                   'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
    }
    // How-to add class path:
    //     http://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle
    //     https://gist.github.com/simon04/6865179
}

作为要点here

结果可以在build/distributions中找到,解压缩的内容如下所示:

  

lib / commons-lang3-3.3.2.jar
  MyJarFile.jar

MyJarFile.jar#META-INF/MANIFEST.mf的内容:

  

清单 - 版本:1.0
  Main-Class:com.somepackage.MainClass
  Class-Path:lib / commons-lang3-3.3.2.jar
  

答案 2 :(得分:1)

应用程序插件要求您设置主类名称,如下所示:

mainClassName = "com.test.HelloWorld"

您需要将其添加到构建脚本中。请记住,如果您尝试使用java命令运行应用程序,则还需要使用-cp设置类路径。

应用程序插件通过提供任务distZip简化了此过程。如果您运行该任务,则会在build/distributions下为您创建完整分发。分发包含启动脚本和所有依赖项。生成的启动脚本已经为您设置了类路径,因此您不必再处理它了。

答案 3 :(得分:0)

从Gradle 6.0开始,它是:

tasks {
    val deps by registering(Copy::class) {
        from(configurations.runtimeClasspath)
        into("build/deps")
    }
}

答案 4 :(得分:0)

java插件可以打包具有依赖项的jar,并且不需要application插件。像下面这样的任务会做:

task buildWithDeps(type: Jar) {
    manifest {
        attributes "Main-Class": "com.test.HelloWorld"
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

答案 5 :(得分:0)

至少从Gradle 5.6.4开始,您将需要做一些更接近此的事情。

  getCats:
    handler: catCrud.getCats
    module: src/functions/catCrud
    events:
      - http: 
          path: /cat
          method: get
          authorizer:
            name: authorizeFunc
            identitySource: method.request.header.Authorization
            type: token