在我的build.gradle文件中,我需要添加以下行:
shadowJar {
mergeServiceFiles()
}
Run Code Online (Sandbox Code Playgroud)
否则罐子不能正常运行.我想知道这条线到底是做什么的?我在Eclipse Luna中使用Gradle插件.我在一个Java项目上创建了jar,它取决于另一个Java项目.
(这是使用gradle 2.4)
对于我的一个项目,分成几个子模块,我使用的shadow插件非常适合我的需要; 它有一个main,并且根据插件的自述文件的推荐,我使用应用程序插件与它一起使用,以便在清单中生成Main-Class,一切正常.
现在,这是一个SonarQube插件项目,我也使用(成功!)gradle声纳packagin插件.这个插件的作用是,当你./gradlew build
生成声纳插件而不是"常规"jar时.
我希望在这里为我的子项目做同样的事情,除了我希望它只生成影子jar插件而不是"常规"插件...现在我使用这个简单的文件生成两个:
buildscript {
repositories {
jcenter();
}
dependencies {
classpath(group: "com.github.jengelman.gradle.plugins",
name:"shadow", version:"1.2.1");
}
}
apply(plugin: "application");
apply(plugin: "com.github.johnrengelman.shadow");
dependencies {
// whatever
}
mainClassName = //whatever
artifacts {
shadowJar;
}
// Here is the hack...
build.dependsOn(shadowJar);
Run Code Online (Sandbox Code Playgroud)
如何修改此文件以便仅生成阴影jar而不是常规jar?
问题描述:
我正在使用 Gradle Shade 插件,一切正常,并将资源文件复制到最终的 jar。但是,正如文档所说,它不能包含其他.jar
文件作为资源,因为它无法将它们与依赖项区分开来。它不是解压它们。
我想要做什么:
我想将.jar
文件tools
夹(build.gradle
位于my 旁边)中的额外文件复制到任务最终jar
生成的文件中shadowJar
。
问题:
如何扩展任务 ( shadowJar
) 以将其他文件复制到生成的 jar 文件中。
我正在使用 Gradle Shadow jar 插件为 selenium 生成一个 fat jar。Gradle kts 中声明了以下代码:
dependencies {
val seleniumV = "4.1.4"
val phantomJSV = "1.5.0"
val htmlUnitV = "3.61.0"
// Selenium
api("org.seleniumhq.selenium:selenium-api:${seleniumV}")
api("org.seleniumhq.selenium:selenium-support:${seleniumV}")
}
tasks {
shadowJar {
exclude("META-INF/*.SF")
exclude("META-INF/*.DSA")
exclude("META-INF/*.RSA")
}
}
Run Code Online (Sandbox Code Playgroud)
在我的电脑上编译成功,但是在云端编译时遇到以下错误:
FAILURE: Build failed with an exception.
02:23
* What went wrong:
02:23
Could not determine the dependencies of task ':repack:selenium-repack:shadowJar'.
02:23
> Could not resolve all files for configuration ':repack:selenium-repack:runtimeClasspath'.
02:23
> Could not find netty-transport-native-epoll-4.1.76.Final-linux-x86_64.jar (io.netty:netty-transport-native-epoll:4.1.76.Final).
02:23
Searched in …
Run Code Online (Sandbox Code Playgroud) 我有以下几点:
shadowJar {
relocate 'com.google.common', 'com.example.com.google.common'
}
Run Code Online (Sandbox Code Playgroud)
它会生成包含所有模块依赖项的“-all.jar”文件。
shadowJar {
relocate 'com.google.common', 'com.example.com.google.common'
dependencies {
include('com.example.com.google.common')
}
}
Run Code Online (Sandbox Code Playgroud)
和:
shadowJar {
relocate 'com.google.common', 'com.example.com.google.common'
dependencies {
include(dependency('com.google.guava:guava:14+'))
}
}
Run Code Online (Sandbox Code Playgroud)
两者都产生绝对没有类的“-all.jar”文件。
如何创建仅包含项目类和重定位类的“-all.jar”文件?
当尝试创建一个 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 Gradle 插件构建一个 Jar,其中包含目录中的所有源文件 src/main/java
和目录中的其他 Jar 文件lib
,并且工作正常。我需要的是另一个 ShadowJar 任务,该devShadowJar
任务不会在src/main/resources
文件夹中提取 JSON 文件,而是在文件夹中提取 JSON 文件src/dev/resources
。
我将其添加到build.gradle
文件中以定义dev
源集:
sourceSets {
dev
}
Run Code Online (Sandbox Code Playgroud)
但现在我不确定如何创建一个devShadowJar
任务来使用dev
JSON 资源而不是位于src/main/resources
.
我有以下任务:
task myJar(type: Jar) {
archiveName = 'myJar.jar'
includeEmptyDirs = false
destinationDir = rootProject.libsDir
dependsOn compileJava
manifest.attributes('Class-Path': '../lib/commons-lang-2.5.jar')
into '/', {
from compileJava.destinationDir
include 'com/myCompany/project/util/order/**',
'com/myCompany/project/event/**',
}
}
Run Code Online (Sandbox Code Playgroud)
我想将所有类从 com/myCompany/project/event/** 重新定位到 com/myCompany/re located/project/event/** (以便某些应用程序使用我的 jar 并具有 com.myCompany.project.event 包定义将避免任何可能的冲突)
我发现可以使用影子插件来完成,我尝试添加
relocate 'com.myCompany.project.event.', 'com.myCompany.relocated.project.event.'
Run Code Online (Sandbox Code Playgroud)
在这个任务下,但它似乎不起作用。有谁知道我应该在哪里添加这一行?