Answers:
可执行jar文件只是清单中包含Main-Class条目的jar文件。因此,您只需要配置jar任务即可在清单中添加此条目:
jar {
manifest {
attributes 'Main-Class': 'com.foo.bar.MainClass'
}
}
您可能还需要在清单中添加类路径条目,但这将以相同的方式完成。
参见http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
JB Nizet和Jorge_B的答案都是正确的。
以最简单的形式,使用Gradle创建可执行JAR只是将适当的条目添加到manifest即可。但是,在类路径中包含依赖项的情况更为常见,因此这种方法在实践中很棘手。
的应用的插件提供了一种替代方法; 它提供了以下功能,而不是创建可执行的JAR:
run
任务,可以轻松地直接从构建中轻松运行应用程序installDist
任务,该任务生成一个目录结构,其中包括内置的JAR,它依赖的所有JAR以及一个将其全部组合到可以运行的程序中的启动脚本distZip
和distTar
创建包含完整应用程序分发的归档的任务(启动脚本和JAR)第三种方法是创建一个所谓的“胖JAR”,它是一个可执行JAR,它不仅包括组件的代码,还包括其所有依赖项。有几种使用这种方法的插件。我提供了一些我知道的链接。我敢肯定还有更多。
configurations.runtime
在单个jar中添加捆绑运行时依赖项。
.tar
/ .zip
文件?
正如其他人指出的那样,为了使jar文件可执行,必须Main-Class
在清单文件的属性中设置应用程序的入口点。如果依赖项类文件未并置,则需要Class-Path
在清单文件的条目中进行设置。
我已经尝试了各种插件组合,而对于创建可执行jar的简单任务却没有尝试,并且某种程度上包括了依赖项。所有插件似乎都缺少一种或另一种方式,但最终我得到了想要的结果。没有神秘的脚本,没有一百万个不同的迷你文件污染了构建目录,一个非常干净的构建脚本文件,最重要的是:没有一百万个外国第三方类文件合并到我的jar档案中。
为了方便起见,以下是从此处复制粘贴的信息。
[操作方法]在子目录中创建具有依赖项jar的分发zip文件,/lib
并将所有依赖Class-Path
项添加到清单文件中的条目中:
apply plugin: 'java'
apply plugin: 'java-library-distribution'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.3.2'
}
// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)
jar {
// Keep jar clean:
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
manifest {
attributes 'Main-Class': 'com.somepackage.MainClass',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
}
// How-to add class path:
// /programming/22659463/add-classpath-in-manifest-using-gradle
// https://gist.github.com/simon04/6865179
}
在这里担任要点。
可以在中找到结果build/distributions
,解压缩后的内容如下所示:
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
内容MyJarFile.jar#META-INF/MANIFEST.mf
:
清单版本:1.0
主类:com.somepackage.MainClass
类路径:lib / commons-lang3-3.3.2.jar
lib
生成的zip / tar文件的目录中,而是在lib
的父目录中。该解决方案似乎对我来说是完美的。
"lib/$it.name"
为即可"$it.name"
完成工作。
对我来说,最省力的解决方案是使用gradle-shadow-plugin
除了应用插件外,所有需要做的是:
配置jar任务以将Main类放入清单
jar {
manifest {
attributes 'Main-Class': 'com.my.app.Main'
}
}
运行gradle任务
./gradlew shadowJar
从build / libs /中获取app-version-all.jar
最后通过以下命令执行它:
java -jar app-version-all.jar
build.gradle
例子。
'com.my.app.MainKt'
。没有更多信息,我无法进一步帮助您。
您是否尝试过“ installApp”任务?是否不使用一组启动脚本创建完整目录?
http://www.gradle.org/docs/current/userguide/application_plugin.html
installApp
不会创建META-INF/MANIFEST.MF
文件。难道我做错了什么?
谢谢康斯坦丁(Konstantin),它像一种魅力,几乎没有任何细微差别。出于某种原因,将主类指定为jar清单的一部分并不能很好地工作,而是需要mainClassName属性。这是build.gradle的一个片段,其中包括使之正常工作的所有内容:
plugins {
id 'java'
id 'com.github.johnrengelman.shadow' version '1.2.2'
}
...
...
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
...
...
mainClassName = 'com.acme.myapp.MyClassMain'
...
...
...
shadowJar {
baseName = 'myapp'
}
运行gradle shadowJar之后,您将在build文件夹中获取myapp- {version} -all.jar,可以将其作为java -jar myapp- {version} -all.jar运行。
我检查了很多解决方案的链接,最后做了以下提到的步骤使它起作用。我正在使用Gradle 2.9。
在您的build,gradle文件中进行以下更改:
提及插件:
apply plugin: 'eu.appsatori.fatjar'
提供构建脚本:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "eu.appsatori:gradle-fatjar-plugin:0.3"
}
}
提供主要类别:
fatJar {
classifier 'fat'
manifest {
attributes 'Main-Class': 'my.project.core.MyMainClass'
}
exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF'
}
创建胖子:
./gradlew clean fatjar
从/ build / libs /运行fatjar:
java -jar MyFatJar.jar