我将 Gradle 用于一个简单的 Java 项目,并希望生成一个单一的 fat JAR,其中也包含源代码。
\n\n我在以下位置准备了一个示例存储库: https: //github.com/szarnyasg/gradle-shadowjar-source。我尝试了这个build.gradle配置:
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\nRun Code Online (Sandbox Code Playgroud)\n\n我可以用以下方法构建它:
\n\n./gradlew clean build shadowjar\nRun Code Online (Sandbox Code Playgroud)\n\n这会在目录中产生两个 JAR 文件build/libs:
example-fat.jar- 没有来源的胖 JARexample.jar- 一个包含(仅)源代码的 JARGradle Shadow 插件的文档指出
\n\n\n\n\n
java在存在或插件的情况下groovy,Shadow 将自动配置以下行为:[...]
\n\n …
当尝试创建一个 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 文件中,但仍然不高兴。
回答几个问题:
由于 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) 我有一个 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) 构建失败:
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) 我正在使用 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)