【问题标题】:Gradle - How pack dependencies into jarGradle - 如何将依赖项打包到 jar 中
【发布时间】:2014-10-13 19:52:18
【问题描述】:

我是 gradle 新手。

我有 Java 项目,具有 maven 依赖项和本地 Java 归档依赖项。我想构建一个独立的 jar,其中包含我的代码和所有依赖项。

我试过了

dependencies {
    runtime files(...)
    runtime group ...
}

在我稍后运行程序时使库可用,但它不起作用,它们在运行时不可用...

我也试过这个:

from("$projectDir") {
    include '../lib/**';
}

但是没有成功...java程序运行时找不到依赖项(NoClassDefFoundError)。

【问题讨论】:

  • Java 不会从 jar 中的 jar 中加载类,除非您使用特殊的类加载器来执行此操作。
  • 我认为这很容易。在依赖项下 { 编译 fileTree(dir: "yourfolderwithpathwhereyouhavejarsetcfiles", include: "*.jar") }

标签: java jar gradle dependencies


【解决方案1】:

回答你的问题:

我想构建一个独立的 jar,其中包含我的代码和所有 依赖关系。

听起来你在问如何在 Gradle 中构建一个“胖罐子”。您可以使用 JAR 任务执行此操作,如下所示:

jar {
     from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }  
     ...
}

第一行代码基本上声明要在“编译”依赖项配置下“打包”所有配置的依赖项。显然,如果您在要包含的其他依赖项配置中有不同的依赖项,您将包含它们或代替它们,即

configurations.runtime.collect { ... }

运行构建任务或创建 JAR 的任何任务后,您应该在相应的存档中找到项目的所有依赖项 JAR。

【讨论】:

  • 其他成语是什么?
【解决方案2】:

按原样在 gradle 5 上工作:

task buildJar(type: Jar) {
    manifest {
        attributes(
                'Main-Class': 'org.mycompany.mainclass'             
        )
    }
    classifier = 'all'
    baseName = 'MyJar'
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
         }
            {
                exclude "META-INF/*.SF"
                exclude "META-INF/*.DSA"
                exclude "META-INF/*.RSA"
            }
    with jar
}

Jar 将被放置在./build/libs

【讨论】:

  • 尝试运行以这种方式生成的 jar 时出现“无主清单属性”错误
猜你喜欢
  • 2015-11-24
  • 2012-11-01
  • 1970-01-01
  • 2018-11-09
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多