当前位置: 首页 > 知识库问答 >
问题:

Dropwizard+Gradle fatJar用于带有子项目的项目拉入gradle-api-5.4.1.jar deps

吴宝
2023-03-14

我有一个Gradle项目,作为一个简单的示例,它看起来类似于以下内容:

root
|
|build.gradle.kts
|settings.gradle.kts
|config.yaml
|web/
    |build.gradle.kts
    |src/
        |main/
             |java....(etc)

web项目是一个纯粹的Dropwizard应用程序,它只做声明一个配置和一个使用它的应用程序,以便服务器能够启动。

在我的root路径中,我已经在settings.gradle.kts文件中定义了我的子项目(在本例中为:web)。在我的rootbuild.gradle.kts中,我声明了一个实现(project(“:web”))依赖项。

我有一个run任务和一个fatjar任务来运行/构建这个应用程序。


val run by tasks.getting(JavaExec::class) {
    args("server", "config.yaml")
}

val fatJar = task("fatJar", type = Jar::class) {
    manifest {
        attributes["Implementation-Title"] = "Some API"
        attributes["Main-Class"] = "my.package.web.HelloWorldApplication"
    }
    from(configurations.runtimeClasspath.get().map({ if (it.isDirectory) it else zipTree(it) }))
    with(tasks.jar.get() as CopySpec)
}

tasks {
    "build" {
        dependsOn(fatJar)
    }
}

我可以构建fatJar,它包含了我所期望的所有类(根的依赖项、web的依赖项、它们的传递依赖项,等等)。

但是,当我运行./gradlew run时,由于在类路径上发现多个日志绑定,启动Dropwizard应用程序时出错。下面是错误:

./gradlew run
Starting a Gradle Daemon, 1 busy and 1 incompatible and 3 stopped Daemons could not be reused, use --status for details

> Task :run
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/me/.gradle/caches/5.4.1/generated-gradle-jars/gradle-api-5.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/me/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.3/7c4f3c474fb2c041d8028740440937705ebb473a/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.gradle.internal.logging.slf4j.OutputEventListenerBackedLoggerContext]
Exception in thread "main" java.lang.IllegalStateException: Unable to acquire the logger context
        at io.dropwizard.logging.LoggingUtil.getLoggerContext(LoggingUtil.java:46)
        at io.dropwizard.logging.BootstrapLogging.bootstrap(BootstrapLogging.java:52)
        at io.dropwizard.logging.BootstrapLogging.bootstrap(BootstrapLogging.java:41)
        at io.dropwizard.Application.bootstrapLogging(Application.java:38)
        at io.dropwizard.Application.<init>(Application.java:26)
        at my.package.web.HelloWorldApplication.<init>(HelloWorldApplication.java:15)
        at my.package.web.HelloWorldApplication.main(HelloWorldApplication.java:17)

> Task :run FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> Process 'command '/Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

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

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

BUILD FAILED in 25s
13 actionable tasks: 1 executed, 12 up-to-date

我知道我可以从Dropwizard中删除logback,但我更想弄清楚为什么gradle-api-5.4.1.jar被绑定到我的应用程序中。我一辈子都弄不明白,也不明白为什么它会被拉进来。

任何指示都将不胜感激。

谢谢

共有1个答案

郜杰
2023-03-14

因此,我在问这个问题和我正在做的事情时犯的错误是,我没有提到或意识到我在意外事件的根脚本中应用了kotlin-dsl插件。一旦我移除这个,一切都如我所愿。

 类似资料:
  • 我无法构建gradle项目,即使我编辑gradle属性,我也会得到以下错误: 我该如何解决这个问题?

  • 是否可以设置子gradle项目的父项目。 在我的例子中,所有父子项目都位于文件层次结构中的同一级别。例如 > 代码 > /父项目 构建。格拉德尔 /child项目1 构建。格拉德尔 /子项目2 构建。格拉德尔 这里,项目1依赖于项目2,所以我将它们称为 也在我的设置中。gradle文件,我有 有了它,我可以从父项目文件夹运行任务,但单个任务不会从子项目运行。

  • 我有一个多项目gradle构建,当我运行“gradle war”时,它在每个子项目中构建一个war文件。 我现在希望在根项目中创建一个dist或tar任务,将所有war文件添加到tar中。 如何运行依赖于子项目的特定任务的任务?

  • 我查看了文档,没有找到这样做的方法。有没有办法告诉gradle idea任务创建目录项目结构()而不是项目/模块文件()?

  • 我面临以下问题。我有一个多模块的Gradle项目。一个模块是我的根项目,第二个模块是集成测试。 为了让我的集成测试运行,复制任务需要首先运行,以便将一些资产移动到项目根目录上的文件夹中。 我已经在我的根项目上定义了这样一个任务,当我试图调用它时,它什么也不做(我尝试了几种不同的调用方式)。 由于失败,我继续在子项目本身上创建了以下任务: 这是我的另一个任务。我的目标是让它将根项目类以及在下生成的j

  • 我想在我的Android/Eclipse项目中使用gradle,因为我希望能够在正式版本旁边安装我的应用程序的开发版本(如下所示:同时安装稳定和开发应用程序版本的实用方法是什么?) 使用命令行这样做对我来说是可以的。 因此,我将项目的src文件夹移动到src/main/java并创建了一个文件(如下所述:http://www.nodeclipse.org/projects/gradle/andro