英文:
Unable to create a fat jar from Gradle application
问题
我在从Gradle应用程序创建一个fat jar时遇到了困难。
我运行了./gradlew jar
和./gradlew clean build
命令。这两个命令似乎在应用程序的各个子模块中创建了有效的.jar
文件,但是在项目根目录中的.jar
文件只包含了MANIFEST.MF
文件,没有其他内容。
应用程序的结构如下所示:
nova-app
:这是包含main
方法和Dropwizard的config.yml
文件的项目nova-dal
nova-core
build.gradle
Procfile
settings.gradle
- ... 其他不相关的文件/文件夹
build.gradle(在根项目中)
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.net.URI
plugins {
base
kotlin("jvm") version "1.3.72"
maven-publish
// 应用程序插件以添加构建CLI应用程序的支持。
java
application
}
application {
mainClassName = "com.nova.app.Nova"
}
tasks.withType<Jar> {
enabled = true
manifest {
attributes["Main-Class"] = application.mainClassName
}
from(configurations.runtimeClasspath.get().map {if (it.isDirectory) it else zipTree(it)})
}
allprojects {
group = "com.nova"
version = "1.0.0"
repositories {
mavenCentral()
maven { url = URI("https://plugins.gradle.org/m2/") }
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions.jvmTarget = "1.8"
kotlinOptions.javaParameters = true
}
}
tasks.register("stage") {
dependsOn(":clean", ":build")
}
subprojects {
apply(plugin = "kotlin")
apply(plugin = "jacoco")
apply(plugin = "maven-publish")
tasks.withType<Test>().configureEach {
useJUnitPlatform()
}
dependencies {
...
}
configurations.all {
resolutionStrategy.preferProjectModules()
}
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
}
build.gradle(在主类所在的nova-app
项目中)
import org.springframework.boot.gradle.tasks.bundling.BootJar
plugins {
id("org.springframework.boot") version "2.1.3.RELEASE"
}
tasks.withType<Jar> {
enabled = true
}
tasks.withType<BootJar> {
archiveFileName.set("${this.archiveBaseName.get()}.${this.archiveExtension.get()}")
}
dependencies {
"implementation"(project(":nova-core"))
"implementation"(project(":nova-dal"))
}
settings.gradle
rootProject.name = 'nova'
include ':nova-app'
include ':nova-core'
include ':nova-dal'
我希望能够使用类似于java -jar build/libs/nova-1.0.0.jar
的命令运行应用程序,但目前我得到了Caused by: java.lang.ClassNotFoundException: com.nova.app.Nova
的错误。
有人能指出这个设置中出了什么问题吗?
英文:
I'm having a hard time creating a fat jar from my Gradle app.
I'm running commands ./gradlew jar
and ./gradlew clean build
. Both commands seem to create valid .jars
in the respective sub-modules of the app, but the .jar
in the root of the project only contains the MANIFEST.MF
and nothing else.
The structure of the app looks like following
nova-app
; this is the project where themain
method is and Dropwizard'sconfig.yml
filenova-dal
nova-core
build.gradle
Procfile
settings.gradle
- ... other irrelevant files/folders
build.gradle (in the root project)
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.net.URI
plugins {
base
kotlin("jvm") version "1.3.72"
`maven-publish`
// Apply the application plugin to add support for building a CLI application.
java
application
}
application {
mainClassName = "com.nova.app.Nova"
}
tasks.withType<Jar> {
enabled = true
manifest {
attributes["Main-Class"] = application.mainClassName
}
from(configurations.runtimeClasspath.get().map {if (it.isDirectory) it else zipTree(it)})
}
allprojects {
group = "com.nova"
version = "1.0.0"
repositories {
mavenCentral()
maven { url = URI("https://plugins.gradle.org/m2/") }
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions.jvmTarget = "1.8"
kotlinOptions.javaParameters = true
}
}
tasks.register("stage") {
dependsOn(":clean", ":build")
}
subprojects {
apply(plugin = "kotlin")
apply(plugin = "jacoco")
apply(plugin = "maven-publish")
tasks.withType<Test>().configureEach {
useJUnitPlatform()
}
dependencies {
...
}
configurations.all {
resolutionStrategy.preferProjectModules()
}
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
}
build.gradle (in the nova-app
project where the main class is)
import org.springframework.boot.gradle.tasks.bundling.BootJar
plugins {
id("org.springframework.boot") version "2.1.3.RELEASE"
}
tasks.withType<Jar> {
enabled = true
}
tasks.withType<BootJar> {
archiveFileName.set("${this.archiveBaseName.get()}.${this.archiveExtension.get()}")
}
dependencies {
"implementation"(project(":nova-core"))
"implementation"(project(":nova-dal"))
}
settings.gradle
rootProject.name = 'nova'
include ':nova-app'
include ':nova-core'
include ':nova-dal'
I'd like to be able to run the app with the command like java -jar build/libs/nova-1.0.0.jar
, but currently I'm getting Caused by: java.lang.ClassNotFoundException: com.nova.app.Nova
Could someone point me to what is wrong in this setup?
专注分享java语言的经验与见解,让所有开发者获益!
评论