用Gradle创build可运行的JAR
到目前为止,我通过Eclipse的“Export …”function创build了可运行的JAR文件,但现在我切换到了IntelliJ IDEA和Gradle以实现构build自动化。
这里的一些文章提出了“应用程序”插件,但这并不完全导致我期望的结果(只是一个JAR,没有启动脚本或类似的东西)。
Eclipse如何才能达到与“导出…”对话框相同的结果?
一个可执行的jar文件只是一个jar文件,在其清单中包含一个Main-Class条目。 所以你只需要configurationjar任务就可以在清单中添加这个条目:
jar { manifest { attributes 'Main-Class': 'com.foo.bar.MainClass' } }
您可能还需要在清单中添加类path条目,但这样做也是一样的。
请参阅http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
JB Nizet和Jorge_B的答案都是正确的。
以最简单的forms,使用Gradle创build可执行JAR只是将相应条目添加到清单 。 然而,需要在类path中包含依赖关系更为常见,这使得这种方法在实践中变得棘手。
应用程序插件提供了一种替代方法; 而不是创build一个可执行的JAR,它提供:
- 一个
run
任务,以便于从构build中直接轻松地运行应用程序 - 一个
installDist
任务,它可以生成一个目录结构,包括构build的JAR,它所依赖的所有JAR以及一个启动脚本,这些脚本将它们一起拖放到可以运行的程序中 -
distZip
和distTar
创build包含完整应用程序分发(启动脚本和JAR)的归档任务,
第三种方法是创build一个所谓的“胖JAR”,它是一个可执行的JAR,它不仅包含组件的代码,还包括所有的依赖关系。 有几个不同的插件使用这种方法。 我已经包含了一些我知道的链接。 我相信还有更多。
- 阴影
- 一jar子
- 春季启动
- 胶囊
正如其他人所指出的,为了使jar文件可执行,必须在清单文件的Main-Class
属性中设置应用程序的入口点。 如果依赖类文件不是并置的,则需要在清单文件的Class-Path
条目中设置它们。
我尝试了各种各样的插件组合,并且为了创build一个可执行的jar以及某种程度上的简单任务,还包括依赖关系。 所有插件似乎缺乏这样或那样的,但最终我得到了它,就像我想要的。 没有神秘的脚本,没有百万个不同的迷你文件污染了构build目录,一个非常干净的构build脚本文件,最重要的是:没有百万个外国第三方类文件合并到我的jar文件中。
以下是从这里复制粘贴为您的方便..
[操作方法]在子目录/lib
创build一个包含依赖jar的分发zip文件,并将所有依赖添加到清单文件中的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: // https://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle // https://gist.github.com/simon04/6865179 }
作为一个主旨在这里举行 。
结果可以在build/distributions
find,解压后的内容如下所示:
LIB /公地lang3-3.3.2.jar
与myJarFile.jar
MyJarFile.jar#META-INF/MANIFEST.mf
内容MyJarFile.jar#META-INF/MANIFEST.mf
:
Manifest-Version:1.0
Main-Class:com.somepackage.MainClass
Class-Path:lib / commons-lang3-3.3.2.jar
对于我来说最less的解决scheme就是使用gradle-shadow-plugin
除了应用插件,所有需要做的是:
-
configurationjar任务将您的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
您是否尝试过“installApp”任务? 它不是用一组启动脚本创build一个完整的目录吗?
http://www.gradle.org/docs/current/userguide/application_plugin.html
您可以在模块设置(或项目结构)中定义jar工件。
- 右键单击具有依赖项的模块>打开模块设置>工件> +> JAR>。
- 设置主类。
制作一个jar就像从Build菜单中点击“Build artifact …”一样简单。 作为奖励,您可以将所有依赖关系打包到一个jar中。
经过IntelliJ IDEA 14 Ultimatetesting。
谢谢你康斯坦丁,它的作品像一个细微的魅力。 出于某种原因,将main类指定为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运行。
我检查了解决scheme的一些链接,最后做了下面提到的步骤来得到它的工作。 我正在使用Gradle 2.9。
在您的构buildGradle文件中进行以下更改:
-
提及插件:
apply plugin: 'eu.appsatori.fatjar'
-
提供Buildscript:
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' }
-
创buildfatjar:
./gradlew clean fatjar
-
从/ build / libs /运行fatjar:
java -jar MyFatJar.jar
你也可以很容易地使用terminal来创build.jar文件! 对于Gradle项目,您可以:
$ cd /into/your/project/directory/
$ gradle build
#so gradle构buildjar文件(s):
$ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar
#运行独立的jar! java的
$ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar.original
真肉部分 – 万一!
- 如何使用Gradle创build发行版签名的apk文件?
- “无法启动编译:输出path未指定给模块…”
- 如何在不公开展示源代码的情况下使用Gradle创buildAndroid库Jar?
- 在命令行上使用Gradle生成一个android studio项目失败:Xlint错误
- Gradle任务 – 将parameter passing给Java应用程序
- 了解gradle任务定义中的groovy语法
- Android Studio错误安装Gradle
- 如何使用Gradle在APK文件名中设置versionName?
- 错误:没有这样的属性:GROUP for class:org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer