【发布时间】:2021-05-13 15:39:25
【问题描述】:
我正在尝试使用一些提供的依赖项创建一个可执行的 .jar,并且我有一个 从“gradle init”创建的简单示例,我可以在添加之前执行 .jar 几个提供的依赖项,但是一旦我添加它们就会失败。
我可以重现如下:
mkdir /tmp/foo
cd /tmp/foo
run 'gradle init'
Select type of project to generate:
2: application
Select implementation language:
3: Java
Select build script DSL:
1: Groovy
Select test framework:
1: JUnit 4
Project name (default: foo):
Source package (default: foo):
然后在 build.gradle 的末尾添加以下内容:
jar {
manifest {
attributes "Main-Class": "foo.App"
}
zip64 = true
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
在命令行,运行:
gradle clean ; gradle jar ; java -jar build/libs/foo.jar
你应该看到:
Hello world.
现在将 build.gradle 中的“依赖项”块更改为以下内容:
configurations {
provided
compile.extendsFrom(provided)
}
dependencies {
implementation 'com.google.guava:guava:29.0-jre'
testImplementation 'junit:junit:4.13'
implementation "org.apache.spark:spark-sql_2.11:2.4.4"
implementation "org.apache.spark:spark-hive_2.11:2.4.4"
}
在命令行,再次运行:
gradle clean ; gradle jar ; java -jar build/libs/foo.jar
你应该看到一切都很好:
Hello world.
接下来,请更换
implementation "org.apache.spark:spark-sql_2.11:2.4.4"
implementation "org.apache.spark:spark-hive_2.11:2.4.4"
与
provided "org.apache.spark:spark-sql_2.11:2.4.4"
provided "org.apache.spark:spark-hive_2.11:2.4.4"
在命令行,再次运行:
gradle clean ; gradle jar ; java -jar build/libs/foo.jar
这次你会得到:
Error: Could not find or load main class foo.App
所以这显然是由于试图使 Spark 相关的依赖项“提供”,因此 不是 .jar 的一部分。但是,您会注意到 foo.App 类非常简单,并且具有 与火花无关。所以,目前很困惑为什么主类突然变成了 添加这些类型的依赖项时找不到。提前感谢您的帮助!
【问题讨论】:
-
如果您使用提供,它需要指定的 jars 在您的类路径中,以便您编译代码。这就是您可能会收到此错误的原因。错误似乎具有误导性,但这可能是根本原因。看看这是否有帮助stackoverflow.com/questions/30731084/…
标签: java apache-spark gradle jar executable