java - 构建成功,但运行时依赖在 Gradle 依赖中似乎很糟糕

标签 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 文件时,

它说 Exception in thread "main"java.lang.NoClassDefFoundError: org/apache/commons/math3/complex/Complex

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

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

如何将 Maven 存储库中的外部库包含到 Gradle 生成的 jar 文件中。

最佳答案

您正在寻找的是 application 插件生成的分发 zip 或 shadowJar 插件生成的 shadow jar(也称为 fat jar):

分发 zip(application 插件)

关于分发 zip

分发 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 上)

构建分发 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

shadow jar 是一个巨大的 jar 文件,它是您的程序及其库的组合,打包到一个文件中。您将获得一个独立的文件,可以通过在大多数系统上双击运行(例如,在可以运行的 Windows 上,在 Xubuntu 上,可以通过右键单击并选择“使用 Oracle Java 8 运行时运行”来运行它,等等……)。

构建分发 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

关于java - 构建成功,但运行时依赖在 Gradle 依赖中似乎很糟糕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34836488/

相关文章:

maven - Jenkins使用docker构建无法访问nexus的Maven镜像

java - mac java 9 gradle ClassNotFoundException : javax. xml.bind.JAXBElement 构建时

java - 使用 Java 在 Ubuntu 中获取音频设备名称

java - 异步 api 的 CPU 利用率非常高

java - Mule:检查应用程序是否准备就绪

java - 如何使用 java3D API 在纹理上写入文本?

security - Maven Java EE 项目中的 OWASP ESAPI simpleTest

maven - 从 Maven 部署到 JFrog Artifactory

android-studio - 没有上下文的奇怪gradle构建错误

android - 应用插件失败 [id 'com.android.internal.version-check' ]