问题

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

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

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


#1 热门回答(109 赞)

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

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

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

Seehttp://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html


#2 热门回答(72 赞)

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

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

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

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

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

  • 影子
  • 一个罐子
  • 弹簧靴
  • 胶囊

#3 热门回答(29 赞)

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

我已经尝试了各种插件组合,而不是创建可执行jar的简单任务,不知何故,包括依赖项。所有插件似乎都缺乏这种或那种方式,但最终我得到了它就像我想要的那样。没有神秘的脚本,没有一百万个不同的迷你文件污染构建目录,一个非常干净的构建脚本文件,最重要的是:没有一百万个外国第三方类文件合并到我的jar存档中。
以下是来自here的复制粘贴,以方便你使用..
[如何]在子目录/lib中创建具有依赖关系jar的分发zip文件,并在清单文件中添加所有依赖关系到Class-Pathentry:

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
}

作为gisthere托管。

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

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

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

Manifest-Version:1.0 Main-Class:com.somepackage.MainClass Class-Path:lib / commons-lang3-3.3.2.jar


原文链接