我有兴趣在单个可执行jar文件中构建一个包含所有模块依赖项和外部jar的jar,我将能够使用java -jar myApp.jar
运行。
我有模块A,它依赖于模块B.
目前我正在使用gradle,我的build.gradle
脚本如下所示:
apply plugin: 'fatjar'
description = "A_Project"
dependencies {
compile project(':B_Project')
compile "com.someExternalDependency::3.0"
}
当我通过gradle命令构建它时:clean build fatjar
按预期创建一个胖罐“A.jar”。
但是,如上所述,运行它会导致:
no main manifest attribute, in A.jar
如何修改我的build.gradle
文件并指定主类或清单?
答案 0 :(得分:16)
我自己已经弄清楚了: 我用过uberjar Gradle任务。 现在我的build.gradle文件如下所示:
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'com.organization.project.package.mainClassName'
version = '1.0'
task uberjar(type: Jar) {
from files(sourceSets.main.output.classesDir)
from {configurations.compile.collect {zipTree(it)}} {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
manifest {
attributes 'Main-Class': 'com.organization.project.package.mainClassName'
}
}
dependencies {
compile project(':B_Project')
compile "com.someExternalDependency::3.0"
}
现在我将它与命令一起使用:
清理构建uberjar
它构建了一个漂亮的可运行jar:)
答案 1 :(得分:5)
为了让它使用fatjar工作,我在fatJar任务中添加了一个manifest部分:
task fatJar(type: Jar) {
baseName = project.name + '-all'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
attributes 'Main-Class': 'com.organization.project.package.mainClassName'
}
}