标签: shadowjar

在使用shadowJar和Scala依赖项时,如何修复丢失的conf文件?

为有像我这样的未来问题的用户写这个.在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

11
推荐指数
1
解决办法
1876
查看次数

ShadowJar:没有为属性“mainClassName”指定值

在调整我的构建文件,我似乎 已经遇到了一个错误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)

uberjar gradle shadowjar gradle-kotlin-dsl fatjar

10
推荐指数
2
解决办法
4440
查看次数

如何将测试类包含到 shadowJar 中?

我正在使用 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)

与此有关。我不知道,它是如何知道的,要构建什么,但它有效。

现在,是否有可能也包含测试类?

java testing unit-testing gradle shadowjar

8
推荐指数
1
解决办法
2733
查看次数

什么是.kotlin_builtins文件,我可以从我的uberjars中省略它们吗?

我正在努力将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)

jar proguard gradle kotlin shadowjar

8
推荐指数
1
解决办法
2178
查看次数

Heroku Java应用程序在本地崩溃但不在网络上崩溃

我有我的主要课程:

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 …

java git heroku shadowjar

8
推荐指数
1
解决办法
395
查看次数

如何使gradle ShadowJar任务也创建其子项的源和javadoc?

我有一个包含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的文档说它应该默认执行此操作.

java gradle shadowjar

8
推荐指数
1
解决办法
1426
查看次数

gRPC UnsupportedAddressTypeException,但仅当与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)

intellij-idea build.gradle grpc shadowjar gradle-kotlin-dsl

8
推荐指数
1
解决办法
2854
查看次数

无法为gradle任务设置类型shadowJar

我正在使用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 build.gradle shadowjar

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

为每种应用程序风格创建多个shadowJars

我正在尝试使用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)

java jar gradle build.gradle shadowjar

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

我们能否构建一个依赖 v3 的 AAR,而不会有与 v2 的客户端应用程序依赖发生冲突的风险?

我们想制作一个 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 时进行迁移步骤。我还没有找到一种令人满意的方法来做到这一点。真的没有更好的解决方案吗?

dependencies android gradle aar shadowjar

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