使用Gradle创建可运行的JAR

时间:2014-02-12 07:15:45

标签: java jar gradle

到目前为止,我通过Eclipse“Export ...”功能创建了可运行的JAR文件,但现在我切换到IntelliJ IDEA和Gradle进行构建自动化。

这里的一些文章提出了“应用程序”插件,但这并不完全导致我期望的结果(只是一个JAR,没有启动脚本或类似的东西)。

如何通过Eclipse“Export ...”对话框实现相同的结果?

11 个答案:

答案 0 :(得分:133)

可执行jar文件只是一个jar文件,其清单中包含Main-Class条目。因此,您只需配置jar task即可在其清单中添加此条目:

jar {
    manifest {
        attributes 'Main-Class': 'com.foo.bar.MainClass'
    }
}

您可能还需要在清单中添加类路径条目,但这将以相同的方式完成。

请参阅http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html

答案 1 :(得分:88)

JB Nizet和Jorge_B的答案都是正确的。

在最简单的形式中,使用Gradle创建可执行JAR只需要向manifest添加适当的条目。但是,在类路径中包含依赖项更为常见,这使得这种方法在实践中变得棘手。

application plugin提供了另一种方法;它不是创建可执行的JAR,而是提供:

  • 一个run任务,以便于直接从构建
  • 轻松运行应用程序
  • 一个installDist任务,它生成一个目录结构,包括构建的JAR,它依赖的所有JAR,以及一个将它们全部集成到一个可以运行的程序中的启动脚本
  • distZipdistTar任务创建包含完整应用程序分发(启动脚本和JAR)的存档

第三种方法是创建一个所谓的“胖JAR”,它是一个可执行的JAR,不仅包括组件的代码,还包括它的所有依赖项。有一些不同的插件使用这种方法。我已经包含了一些我所知道的链接;我相信还有更多。

答案 2 :(得分:31)

正如其他人所说,为了使jar文件可执行,必须在清单文件的Main-Class属性中设置应用程序的入口点。如果依赖类类文件未并置,则需要在清单文件的Class-Path条目中设置它们。

我已经尝试了各种插件组合,而不是创建可执行jar的简单任务,不知怎的,包括依赖项。所有插件似乎都缺乏这种或那种方式,但最后我得到了它就像我想要的那样。没有神秘的脚本,没有百万个不同的迷你文件污染构建目录,一个非常干净的构建脚本文件,最重要的是:没有一百万外国第三方类文件合并到我的jar存档。

以下是here的复制粘贴,以方便您使用。

[如何]在子目录/lib中创建具有依赖项jars的分发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
}

作为要点here

结果可以在build/distributions中找到,解压缩的内容如下所示:

  

lib / commons-lang3-3.3.2.jar
  MyJarFile.jar

MyJarFile.jar#META-INF/MANIFEST.mf的内容:

  

清单 - 版本:1.0
  Main-Class:com.somepackage.MainClass
  Class-Path:lib / commons-lang3-3.3.2.jar
  

答案 3 :(得分:21)

我的最小努力解决方案是使用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

答案 4 :(得分:5)

您是否尝试过'installApp'任务?它是否不使用一组启动脚本创建完整目录?

http://www.gradle.org/docs/current/userguide/application_plugin.html

答案 5 :(得分:4)

谢谢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后,您可以在构建文件夹中获取myapp- {version} -all.jar,该文件夹可以作为java -jar myapp- {version} -all.jar运行。

答案 6 :(得分:3)

您可以在模块设置(或项目结构)中定义jar工件。

  • 右键单击模块>打开模块设置>人工制品> +> JAR>来自具有依赖关系的模块。
  • 设置主要课程。

制作一个jar就像从Build菜单中单击“Build artifact ...”一样简单。作为奖励,您可以将所有依赖项打包到一个jar中。

在IntelliJ IDEA 14 Ultimate上测试。

答案 7 :(得分:2)

我检查了一些解决方案的链接,最后做了下面提到的步骤以使其正常工作。我正在使用Gradle 2.9。

在build,gradle文件中进行以下更改:

  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. 创建fatjar:

    ./gradlew clean fatjar
    
  5. 从/ build / libs /:

    运行fatjar
    java -jar MyFatJar.jar
    

答案 8 :(得分:0)

您可以使用SpringBoot插件:

plugins {
  id "org.springframework.boot" version "2.2.2.RELEASE"
}

创建罐子

gradle assemble

然后运行它

java -jar build/libs/*.jar

注意:您的项目不需要是SpringBoot项目即可使用此插件。

答案 9 :(得分:0)

  1. 为清单配置主类

如果您正在使用gradle项目,只需将以下内容添加到build.gradle

jar {
    manifest {
        attributes(
               'Main-Class': 'pokerhandscorer.PokerHandScorer'
        )
    }
}
  • 其中“ pokerhandscorer”是包装名称的名称, 而PokerHandScorer是主要的班级名称

这会在您的\ build \ libs {jarFilename} .jar中创建一个jar文件。

  1. 使用java -jar /{path}/{jarFileName.jar}运行jar文件

java -jar / {path} / {jarFileName.jar}

答案 10 :(得分:0)

这是我使用Gradle 6.7尝试的解决方案

可运行的胖子jar(所有相关库都复制到了jar中)

task fatJar(type: Jar) {
   
    manifest {
        attributes 'Main-Class': 'com.example.gradle.App'
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    } with jar
    
}

将所有依赖项复制到目录并将类路径添加到清单的可运行jar

    def dependsDir = "${buildDir}/libs/dependencies/"
    task copyDependencies(type: Copy) {
        from configurations.compile
        into "${dependsDir}"
    }
    task createJar(dependsOn: copyDependencies, type: Jar) {
      
        manifest {
            attributes('Main-Class': 'com.example.gradle.App',
                    'Class-Path': configurations.compile.collect { 'dependencies/' + it.getName() }.join(' ')
            )
        }
        with jar
    }

如何使用?

  • 将上述任务添加到build.gradle
  • 执行gradle fatJar //创建fatJar
  • 执行gradle createJar //创建具有复制依赖关系的jar。

更多详细信息:https://jafarmlp.medium.com/a-simple-java-project-with-gradle-2c323ae0e43d