用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以及一个启动脚本,这些脚本将它们一起拖放到可以运行的程序中
  • distZipdistTar创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/distributionsfind,解压后的内容如下所示:

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文件中进行以下更改:

  1. 提及插件:

     apply plugin: 'eu.appsatori.fatjar' 
  2. 提供Buildscript:

     buildscript { repositories { jcenter() } dependencies { classpath "eu.appsatori:gradle-fatjar-plugin:0.3" } } 
  3. 提供主要类别:

     fatJar { classifier 'fat' manifest { attributes 'Main-Class': 'my.project.core.MyMainClass' } exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF' } 
  4. 创buildfatjar:

     ./gradlew clean fatjar 
  5. 从/ 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真肉部分 – 万一!