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