gpt4 book ai didi

java - gradle 创建 jar 不适用于 'implementation' 依赖项

转载 作者:行者123 更新时间:2023-12-01 16:40:00 26 4
gpt4 key购买 nike

我是 gradle 新手,正在尝试从简单的 hello world java grpc 生成一个 jar下面是我的 build.gradle

plugins {
id 'application'
id 'com.google.protobuf' version '0.8.12'
id 'idea'
id 'java'
}

version '1.0'

sourceCompatibility = 1.8

repositories {
mavenLocal()
maven { // The google mirror is less flaky than mavenCentral()
url "https://maven-central.storage-download.googleapis.com/repos/central/data/" }
mavenCentral()
}

dependencies {
implementation 'io.grpc:grpc-netty-shaded:1.29.0'
implementation 'io.grpc:grpc-protobuf:1.29.0'
implementation 'io.grpc:grpc-stub:1.29.0'
testCompile group: 'junit', name: 'junit', version: '4.12'
}


protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.11.0"
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.29.0'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}

sourceSets {
main {
java {
srcDirs 'build/generated/source/proto/main/grpc'
srcDirs 'build/generated/source/proto/main/java'
}
}
}

startScripts.enabled = false

task helloWorldServer(type: CreateStartScripts) {
mainClassName = 'com.javagrpc.HelloWorldServer'
applicationName = 'hello-world-server'
outputDir = new File(project.buildDir, 'tmp')
classpath = startScripts.classpath
}

applicationDistribution.into('bin') {
from(helloWorldServer)
fileMode = 0755
}

distZip.shouldRunAfter(build)

jar {
manifest {
attributes 'Main-Class': 'com.examples.javagrpc.HelloWorldServer',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
}

from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
}

当我运行任务“gradle jar”时,我开始遇到问题,它会在 build/libs 内构建一个 jar,当我运行该 jar 时,它会失败,并显示 java.lang.NoClassDefFoundError: io/grpc/BindableService我解压了jar包,并没有找到里面的grpc依赖项。我尝试直接运行生成的文件

./build/install/java-grpc/bin/hello-world-server

它按预期工作。为了解决 jar 问题,我决定将上述依赖项从 implementation 更改为 api,如下所示。

dependencies {
api 'io.grpc:grpc-netty-shaded:1.29.0'
api 'io.grpc:grpc-protobuf:1.29.0'
api 'io.grpc:grpc-stub:1.29.0'
testCompile group: 'junit', name: 'junit', version: '4.12'
}

现在一切都按预期工作,依赖项位于 jar 内,我可以运行该 jar。但我不确定自官方 example 以来我是否应该在我的依赖项中使用 api 。不使用它?也许我没有正确生成 jar,它可以仅通过依赖项实现生成,任何帮助或指针都将受到高度赞赏。

最佳答案

问题是您使用的 jar 任务修改没有利用新的依赖项配置。

您确实希望从 uber JAR 中的 runtimeClasspath 收集依赖项,而不是从 compile 收集依赖项。毕竟,为了运行,它需要在 implementation 中声明的所有依赖项,但也需要在 runtimeOnly 中声明。请参阅the documentation以更好地理解这些配置之间的关系。

jar {
...
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
...
}

关于java - gradle 创建 jar 不适用于 'implementation' 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61876596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com