为有像我这样的未来问题的用户写这个.在Typesafe配置上构建的库通常使用自己的reference.conf文件并引用某些配置键.使用Gradle shadowJAR插件构建胖JAR时,不包括这些文件.
当胖JAR尝试运行时,Spray和Akka等依赖项会抛出错误.错误看起来像:
Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'spray'
Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka'
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?检查下面的答案.
scala dependency-management gradle typesafe-config shadowjar
在调整我的构建文件,我似乎 已经遇到了一个错误有mainClassName:
thufir@dur:~/NetBeansProjects/HelloSeleniumWorld$
thufir@dur:~/NetBeansProjects/HelloSeleniumWorld$ ./gradlew clean ShadowJar --stacktrace
> Task :shadowJar FAILED
FAILURE: Build failed with an exception.
* What went wrong:
A problem was found with the configuration of task ':shadowJar'.
> No value has been specified for property 'mainClassName'.
* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Exception is:
org.gradle.api.tasks.TaskValidationException: A problem was found with the configuration …Run Code Online (Sandbox Code Playgroud) 我正在使用 shadow Gradle 插件来构建 JAR,其中包含所有引用的 jar。
在我的build.gradle我只有
apply plugin: "com.github.johnrengelman.shadow"
Run Code Online (Sandbox Code Playgroud)
和
jar {
manifest {
attributes 'Main-Class': 'MYCLASS'
}
}
Run Code Online (Sandbox Code Playgroud)
与此有关。我不知道,它是如何知道的,要构建什么,但它有效。
现在,是否有可能也包含测试类?
我正在努力将proguard集成到我的gradle构建中,用于用Kotlin编写的应用程序.我发现proguard正在剥离Kotlin标准库(就像我在简单的Hello World程序中那样),但它在我的jar中留下了一堆文件扩展名的文件.kotlin_builtins.当我配置我的gradle任务以排除这些文件时,程序仍然可以正常工作.这些文件是什么,必须与我的可执行文件uberjar一起发货?
这是我的build.gradle文件的内容供参考:
buildscript {
ext.kotlin_version = '1.0.5'
ext.shadow_version = '1.2.4'
repositories {
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
flatDir dirs: "gradle/proguard"
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.github.jengelman.gradle.plugins:shadow:$shadow_version"
classpath ":proguard:"
}
}
apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
mainClassName = 'namespace.MainKt'
defaultTasks 'run'
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
testCompile "junit:junit:4.12"
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
}
shadowJar {
exclude 'kotlin/**/*.kotlin_builtins'
exclude '.keep'
}
task minify(type: proguard.gradle.ProGuardTask, dependsOn: 'shadowJar') {
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
injars …Run Code Online (Sandbox Code Playgroud) 我有我的主要课程:
public class Main {
public static void main(String[] args){
Spark.port(getHerokuAssignedPort());
get("/hello", (req, res) -> "Hello Heroku World");
}
private static int getHerokuAssignedPort() {
ProcessBuilder processBuilder = new ProcessBuilder();
if (processBuilder.environment().get("PORT") != null) {
return Integer.parseInt(processBuilder.environment().get("PORT"));
}
return 4567; //return default port if heroku-port isn't set (i.e. on localhost)
}
}
Run Code Online (Sandbox Code Playgroud)
我的procfile:
web: java -jar build/libs/CrowdSubhaHeroku-1.0-SNAPSHOT-all.jar
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用shadowJar,因为正常的jar创建不包含我需要的依赖项,例如Spark和Firebase.
现在,如果我这样做:
heroku local web
Run Code Online (Sandbox Code Playgroud)
然后去localhost:5000,我得到404错误.但是,应用程序实际上并没有崩溃.它一直在运行.
这与我不同:
heroku open
Run Code Online (Sandbox Code Playgroud)
之后git add .,git commit -m "x"和git push …
我有一个包含8个子项目的gradle项目和一个配置的shadowjar任务来创建一个"all"jar.toplevel项目设置为对其所有子项具有依赖性,这告诉shadowjar要包括什么:
project(':') {
dependencies {
compile project(':jfxtras-agenda')
compile project(':jfxtras-common')
compile project(':jfxtras-controls')
compile project(':jfxtras-icalendarfx')
compile project(':jfxtras-icalendaragenda')
compile project(':jfxtras-menu')
compile project(':jfxtras-gauge-linear')
compile project(':jfxtras-font-roboto')
}
}
shadowJar {
classifier = null // do not append "-all", so the generated shadow jar replaces the existing jfxtras-all.jar (instead of generating jfxtras-all-all.jar)
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但maven central拒绝所有jar,因为它没有相关的源和javadocs jar.
我如何告诉gradle还生成源和javadoc?ShadowJar的文档说它应该默认执行此操作.
我有一个简单的 gRPC 客户端,由 Gradle 使用 ShadowJar 打包在 jar 中。当我使用main()IntelliJ 运行时,RPC 发送成功。当我使用 运行它时java -jar,出现异常:
更新:我想我已经确定 IntelliJ 和 ./gradlew ShadowJar 提供了同一组类,但顺序不同。我怀疑这会导致不同的行为,但我真的不明白为什么,或者在任何一种情况下如何控制类路径的顺序。如果我能弄清楚哪些类实际上与这里相关,那将会有很大的帮助。完整扩展包括 19k 类文件。
Exception in thread "main" io.grpc.StatusException: UNKNOWN
at io.grpc.Status.asException(Status.java:550)
at io.grpc.kotlin.ClientCalls$rpcImpl$1$1$1.onClose(ClientCalls.kt:296)
at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:562)
at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:70)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:743)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:722)
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.nio.channels.UnsupportedAddressTypeException
at java.base/sun.nio.ch.Net.checkAddress(Net.java:146)
at java.base/sun.nio.ch.Net.checkAddress(Net.java:157)
at java.base/sun.nio.ch.SocketChannelImpl.checkRemote(SocketChannelImpl.java:816)
at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839)
at io.netty.util.internal.SocketUtils$3.run(SocketUtils.java:91)
at io.netty.util.internal.SocketUtils$3.run(SocketUtils.java:88)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
at io.netty.util.internal.SocketUtils.connect(SocketUtils.java:88)
at io.netty.channel.socket.nio.NioSocketChannel.doConnect(NioSocketChannel.java:322)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.connect(AbstractNioChannel.java:248)
at io.netty.channel.DefaultChannelPipeline$HeadContext.connect(DefaultChannelPipeline.java:1342)
at io.netty.channel.AbstractChannelHandlerContext.invokeConnect(AbstractChannelHandlerContext.java:548) …Run Code Online (Sandbox Code Playgroud) 我正在使用gradle v3.4和shadowjar v1.2.4.我添加了以下任务,但在执行此操作时,我收到了下面复制的错误.我添加了ShadowJar类型的任务,以便能够从同一个项目生成不同的jar文件.
在此任务的上下文之外,Shadowjar对我来说很好.
gradle这个
task someJar(type: ShadowJar) {
group = "shadow"
description = "some executable jar"
mainClassName = 'com.some.client.SomeClient'
main = 'com.some.client.SomeClient'
manifest.attributes 'Main-Class': 'com.some.client.SomeClient'
classifier = 'someClient'
from(project.convention.getPlugin(JavaPluginConvention).sourceSets.main.output)
configurations = [project.configurations.runtime]
exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA')
}
Run Code Online (Sandbox Code Playgroud)
使用stacktrace时出错
Caused by: groovy.lang.MissingPropertyException: Could not get unknown property 'ShadowJar' for root project 'someporject' of type org.gradle.api.Project.
at org.gradle.internal.metaobject.AbstractDynamicObject.getMissingProperty(AbstractDynamicObject.java:85)
at org.gradle.groovy.scripts.BasicScript.getProperty(BasicScript.java:81)
at build_2cp7m6fw08pxyu0f84a6pva88.run(/Users/continue/git/iso20022/build.gradle:202)
at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:90)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用gradle并尝试设置一个系统来构建应用程序的不同风格(品牌),这些系统主要因配置而异.到目前为止我所拥有的是两个版本的构建脚本 - 两者都不起作用.
版本1添加了
第一个特定flavor-res于风味的资源文件夹sourcesets,可以覆盖一些默认资源.任务规则定义每种风味的任务,这应该(理想情况下)触发整个jar的构建.
这样可以正常工作并生成所需的罐子,一次一种口味,就像
gradle clean flavorOne
Run Code Online (Sandbox Code Playgroud)
但shadowJar如果我这样做,任务只运行一次
gradle clean flavorOne flavorTwo
Run Code Online (Sandbox Code Playgroud)
剥离脚本:
sourceSets {
main {
...
resources {
srcDirs = ['src/main/resources', "${project.buildDir}/flavor-res/"]
}
}
}
shadowJar { classifier = 'SNAPSHOT' }
tasks.addRule("Pattern: flavor<Name>") { String taskName ->
if (taskName.startsWith("flavor")) {
String flavorName = (taskName - "flavor")
String flavorOutDir = "${project.buildDir}/${flavorName}"
// Set output folder and jar name
task("${taskName}Configure") {
outputs.dir(flavorOutDir)
doFirst {
archivesBaseName = flavorName
project.buildDir = flavorOutDir
}
} …Run Code Online (Sandbox Code Playgroud) 我们想制作一个 Android 档案库 (AAR) 并分发给我们的客户。在这个 Android 库中,我们使用了一些第三方依赖项,我们希望保护它们免受任何版本冲突的影响。我们也不希望将依赖项自动更新到最新版本。
例如这个场景:我们正在使用(并且需要)版本 3 的依赖项和相同依赖项的客户端版本 2 - 由于某种原因,这些版本不兼容,我们的客户端无法更新到版本 3。或者这个:客户端还使用来自另一个提供程序的 AAR,该 AAR 反过来使用版本 2 的依赖项 - 将其更新到版本 3 会破坏其他 AAR。要求软件链的每个部分都与相同的依赖版本兼容并不总是可能的。
使用普通 JAR 时,通过使用ShadowJar在构建步骤中包含和重新定位依赖项,可以轻松避免这种情况。但是对于 AAR,我发现的最佳方法是根据以下内容创建自定义 gradle ShadowJar 任务:https : //github.com/johnrengelman/shadow/issues/183 并在编译实际 AAR 之前执行重新定位步骤。但这使得你的应用源文件需要直接导入重定位的依赖项,即:import relocated.org.com.dependency。
然而,这不是我们认为的 AAR:s 常见问题场景的最佳解决方案,如上所述。我们希望在开发阶段之后,在构建 AAR 时进行迁移步骤。我还没有找到一种令人满意的方法来做到这一点。真的没有更好的解决方案吗?