构建成功但Gradle依赖项中的运行时依赖性似乎很糟糕

时间:2016-01-17 08:28:25

标签: java maven gradle

dependencies {
 compile 'org.slf4j:slf4j-api:1.7.13'
    compile group: 'org.apache.commons', name: 'commons-math3' , version: '+'
    testCompile 'junit:junit:4.12'
}

即使我添加了这个,当我运行 gradle build 时,它也可以运行,并且可以编译带有commons-math3的代码。但是当我在build /中运行一个jar文件时,

它在线程“main”中说异常java.lang.NoClassDefFoundError:org / apache / commons / math3 / complex / Complex

但Gradle官方网站称,“compile”中的资源也将包含在“运行时”依赖项中。我还尝试将 commons-math 添加到运行时。但它不起作用。

也许这是我对依赖系统的误解。

如何将maven存储库中的外部库包含到Gradle创建的jar文件中。

2 个答案:

答案 0 :(得分:3)

您要查找的是由application插件生成的分发拉链或由shadowJar插件生成的影子jar(也称为胖jar):

分发zip(application插件)

关于分发zip

分发拉链看起来像这样:

my-app-0.2.0.zip
├──bin
│  ├──my-app
│  └──my-app.bat
└──lib
   ├──my-app-0.2.0.jar
   ├──slf4j-api.1.7.13.jar
   └──commons-math3-3.6.jar

然后,您可以通过解压缩build/distributions/中生成的内容并运行my-app.bat(在Windows上)或./my-app(在Linux或OS X上)来运行应用程序及其依赖项< / p>

构建分发zip

以下是制作分发zip的示例gradle构建文件:

build.gradle

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

mainClassName = 'org.myapp.Main'

repositories { jcenter() }
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.13'
    compile 'org.apache.commons:commons-math3:3.6'

    testCompile 'junit:junit:4.12'
}

可以使用gradle distributionZipgradle distributionTar投放。要运行该应用程序,请使用gradle run

影子罐

关于影子罐

影子jar是一个巨大的jar文件,它是程序和库的组合,打包在一起。您将获得一个自包含的文件,可以通过双击大多数系统来运行(例如,在可以工作的Windows上,在Xubuntu上,可以通过右键单击并选择&#39; Run with Oracle Java 8来运行它运行时&#39;等...)。

构建分发zip

以下是样本build.gradle文件:

apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

mainClassName = 'org.myapp.Main'

jar {
    manifest {
        attributes('Main-Class': mainClassName)
    }
}

buildscript {
    repositories { jcenter() }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.2'
    }
}

repositories { jcenter() }
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.13'
    compile 'org.apache.commons:commons-math3:3.6'

    testCompile 'junit:junit:4.12'
}

使用gradle shadowJar运行它 - 具有压缩依赖项的jar将位于build/libs中,并且它将被命名为my-app-x.x.x-all.jar

答案 1 :(得分:1)

Gradle首先是一个构建工具(就像maven,顺便说一句)。 它的“响应性”在你提供源文件时开始,在你获得你的工件时结束(在你的情况下它是一个罐子)。

现在,当您打算实际运行应用程序时,这里有许多不同的选项。 如果您只运行java -jar <your_jar>,您自己负责构建类路径。 如果您使用某种外部运行程序运行它,您应该阅读它的文档并提供类路径。

希望这有帮助