标签: shadowjar

在 fat JAR 中包含源

我将 Gradle 用于一个简单的 Java 项目,并希望生成一个单一的 fat JAR,其中也包含源代码。

\n\n

我在以下位置准备了一个示例存储库: https: //github.com/szarnyasg/gradle-shadowjar-source。我尝试了这个build.gradle配置:

\n\n
plugins { id "com.github.johnrengelman.shadow" version "1.2.4" }\n\napply plugin: \'java\'\n\nshadowJar {\n    classifier = \'fat\'\n    manifest { attributes \'Main-Class\': \'org.example.MyMain\' }\n}\n\ntask packageSources(type: Jar) {\n    from sourceSets.main.allSource\n}\n\nartifacts.archives packageSources\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以用以下方法构建它:

\n\n
./gradlew clean build shadowjar\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会在目录中产生两个 JAR 文件build/libs

\n\n
    \n
  • example-fat.jar- 没有来源的胖 JAR
  • \n
  • example.jar- 一个包含(仅)源代码的 JAR
  • \n
\n\n

Gradle Shadow 插件的文档指出

\n\n
\n

java在存在或插件的情况下groovy,Shadow 将自动配置以下行为:

\n\n

[...]

\n\n …

jar gradle shadowjar

5
推荐指数
1
解决办法
2787
查看次数

Gradle:shadowJar 排除了依赖项

当尝试创建一个 fat jar 时,shadowJar 遗漏了很多依赖项。我从工作 pom.xml 创建了一个 build.gradle 文件。Maven 构建一个 fat jar 没有问题。阅读 Gradle 关于构建 fat jar 的信息,shadowJar 插件似乎是推荐的方法。然而,我的 Gradle fat jar 给出了以下运行时错误:

Jul 19, 2018 2:35:10 PM restclients.RestStatus2Streams writeToStream
SEVERE: Error occurred while instantiating com.me.streams.impl.producer.MarlinProducerV10.
==> java.lang.NoClassDefFoundError: org/apache/hadoop/fs/PathId.
Run Code Online (Sandbox Code Playgroud)

显然,我远处的罐子缺少了一些东西。果然,org/apache/hadoop/fs/PathId 和整个依赖目录都丢失了。尽管 pom.xml 没有显式包含“org.apache.hadoop:hadoop-common”依赖项,但我显式将该工件作为依赖项添加到我的 build.gradle 文件中,但仍然不高兴。

回答几个问题:

  • 存储库中是否有 hadoop-common 工件?是的。
  • 存储库中是否有工件的命名版本?是的
  • PathId 类是存储库中的工件吗?该工件的“jar xf”表示“是”。

由于 Maven fat jar 工作完美,并且解压 Maven fat jar 会显示 PathId 类(以及 Gradle fat jar 中缺少的其他类),那么我的 build.gradle 文件和/或 ShadowJar 插件和/或 Gradle 就会出现问题。

构建.gradle文件:

apply plugin: 'java'
apply …
Run Code Online (Sandbox Code Playgroud)

gradle gradle-shadow-plugin shadowjar

5
推荐指数
0
解决办法
1371
查看次数

如何将其他 Gradle 任务的输出文件引用为 ziptree?

我有一个 ShadowJar 和一个 Proguard 任务,它们在我的 Gradle 构建中生成两个 jar 文件。

task obfuscate(type: ProguardTask) {
  outjars ..
}

shadowJar {
  ...
}

task release(type: Jar) {
  from shadowJar
  from obfuscate
  classifier 'all'
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在这种情况下,发布 jar 文件包含影子 jar 和混淆的 jar 文件,作为 jar 本身中的两个文件。我想将它们作为 zipTree 输入。

我的问题是我不知道如何将任务引用转换为该任务实际输出的 zipTree。

我的尝试引导我,from zipTree(shadowJar.outputs.getFiles())但这仍然失败:

> Cannot convert the provided notation to a File or URI: task 'shadowJar' output files.
  The following types/formats are supported:
    - A String or CharSequence path, for example 'src/main/java' or '/usr/include'.
    - …
Run Code Online (Sandbox Code Playgroud)

proguard gradle shadowjar

4
推荐指数
1
解决办法
4462
查看次数

如何为 Kotlin (Gradle) 构建导入 ShadowJar 插件?

构建失败:

thufir@dur:~/NetBeansProjects/kotlin_dsl$ 
thufir@dur:~/NetBeansProjects/kotlin_dsl$ gradle clean run 

> Configure project : 
e: /home/thufir/NetBeansProjects/kotlin_dsl/build.gradle.kts:4:12: Unresolved reference: github


FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'kotlin_dsl'.
> Could not open cache directory 74ykawxta6db3b2bfk9grjikp (/home/thufir/.gradle/caches/4.3.1/gradle-kotlin-dsl/74ykawxta6db3b2bfk9grjikp).
   > Internal error: unable to compile script, see log for details

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD …
Run Code Online (Sandbox Code Playgroud)

build gradle kotlin shadowjar gradle-kotlin-dsl

4
推荐指数
1
解决办法
6168
查看次数

Gradle 清理并复制 JAR 文件

我正在使用 Gradle 构建一个 java 应用程序,我想将最终的 jar 文件传输到另一个文件夹中。我想复制每个上的文件build并删除每个上的文件clean

不幸的是,我只能完成其中一项任务,而不能同时完成两项任务。当我激活任务时copyJar,它成功复制了 JAR。当我包含该clean任务时,不会复制 JAR,如果其中有文件,则会将其删除。就好像有某个任务调用clean.

有什么解决办法吗?

plugins {
    id 'java'
    id 'base'
    id 'com.github.johnrengelman.shadow' version '2.0.2'
}
dependencies {
    compile project(":core")
    compile project("fs-api-reader")
    compile project(":common")
}

task copyJar(type: Copy) {
    copy {
        from "build/libs/${rootProject.name}.jar"
        into "myApp-app"
    }
}

clean {
    file("myApp-app/${rootProject.name}.jar").delete()
}

copyJar.dependsOn(build)

allprojects {
    apply plugin: 'java'
    apply plugin: 'base'

    repositories {
        mavenCentral()
    }

    dependencies {
        testCompile 'junit:junit:4.12'
        compile 'org.slf4j:slf4j-api:1.7.12'
        testCompile group: 'ch.qos.logback', name: …
Run Code Online (Sandbox Code Playgroud)

java gradle shadowjar

4
推荐指数
1
解决办法
6087
查看次数

如何在 gradle 5+ 中为 shadowJar 插件指定存档分类器

从版本 5 开始gradle 更改存档任务行为

这打破了shadowJar不再创建<name>-<version>-all.jar工件的任务默认行为。

如何恢复这种行为并创建*-all.jar

gradle gradle-plugin shadowjar

3
推荐指数
1
解决办法
1726
查看次数