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

构建成功,但运行时依赖在Gradle依赖中似乎不好

包唯
2023-03-14
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官方网站表示,“编译”中的资源也将包含在“运行时”依赖项中。我还尝试将公共数学添加到运行时。但它不起作用。

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

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

共有2个答案

龚振
2023-03-14

Gradle首先是一个构建工具(就像maven一样,顺便说一句)。它的“责任”从您向其提供源文件开始,到您获得工件(在您的情况下是一个jar)结束。

现在,当您实际运行您的应用程序时,这里有大量不同的选项。如果您只运行java-jar

希望这有帮助

上官英哲
2023-03-14

你要找的是应用程序插件产生的分发拉链,或者是shadowJar插件产生的shadow jar(也称为胖jar):

配送拉链如下所示:

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/分发/中生成的内容并运行my-app.bat(在Windows上)或来运行具有其依赖项的应用程序。/my-app(在linux或OS X上)

下面是制作发行版zip的gradle构建文件示例:

build。格雷德尔

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上,在Xu buntu上可以通过右键单击并选择'Run with OracleJava8 Runtime'等来运行...)。

这里再次提供了一个构建示例。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 shadJar运行它-您的具有打包依赖项的jar将位于build/libs中,它将被命名为my-app-x.x.x-all.jar

 类似资料:
  • 我一直在使用gradle作为Springboot,它过去很好,但gradle的构建突然停止了工作。我不断收到错误,说找不到依赖项 这是分级代码: 我得到的错误是: 无法解析组织。springframework。启动:spring启动依赖项:2.4。1.无法解析io。关键的。Spring云:spring云服务依赖项:2.4。1.无法解析组织。springframework。云:spring云依赖项:

  • 我已经创建了一个构建。war文件的非常简单的Maven项目。Maven Version3.2.3,Java Version1.7.0_67。pom.xml文件就是这个要点。 如果我运行,那么项目构建良好。但是,如果首先下载所有具有和的依赖项,然后运行进行脱机构建,则会出现如下错误。 我从两种方式创建的。m2/repository文件夹不同,使用依赖插件创建的文件夹缺少许多文件,其中大多数与Plex

  • 当你首次启动 vite 时,你可能会注意到打印出了以下信息: Optimizable dependencies detected: (侦测到可优化的依赖:) react, react-dom Pre-bundling them to speed up dev server page load...(将预构建它们以提升开发服务器页面加载速度) (this will be run only when

  • 问题内容: 我了解运行时和编译时之间的区别以及如何区分两者,但是我只是看不到需要区分编译时和运行时 依赖项 。 我正在cho的是:程序如何在运行时 不依赖 编译期间 依赖 的东西?如果我的Java应用程序使用log4j,则它需要log4j.jar文件才能进行编译(我的代码与log4j集成并从其中调用成员方法)以及运行时(我的代码绝对无法控制log4j内的代码一旦发生了什么.jar已运行)。 我正在

  • 我正在尝试建立一个gradle项目。 以下是我的项目结构: 这是我的tobris erpgradle.build(1) 这是我的buildSrcgradle.build(2): 我使用hibernate从XML文件生成数据库实体。生成的类位于生成下的src gen文件夹下。 问题是当我构建项目时,src-gen下的类显示此错误 /tobris-erp/build/src-gen/java/com/

  • 这是我的毕业档案 然而,当我使用gradlebuild时,当输出jar在Minecraft中运行时会发生以下错误 这是json中的代码。JAVA 我猜这是因为这个jar中没有依赖项(json-lib),但是我在构建配置文件中设置了它,我想问一下是什么原因导致了这个mod的完整代码(https://github.com/SiongSng/RPMTW-Update-Mod/tree/master/1.