到目前为止,我通过Eclipse“Export ...”功能创建了可运行的JAR文件,但现在我切换到IntelliJ IDEA和Gradle进行构建自动化。
这里的一些文章提出了“应用程序”插件,但这并不完全导致我期望的结果(只是一个JAR,没有启动脚本或类似的东西)。
如何通过Eclipse“Export ...”对话框实现相同的结果?
答案 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,以及一个将它们全部集成到一个可以运行的程序中的启动脚本distZip
和distTar
任务创建包含完整应用程序分发(启动脚本和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就像从Build菜单中单击“Build artifact ...”一样简单。作为奖励,您可以将所有依赖项打包到一个jar中。
在IntelliJ IDEA 14 Ultimate上测试。
答案 7 :(得分:2)
我检查了一些解决方案的链接,最后做了下面提到的步骤以使其正常工作。我正在使用Gradle 2.9。
在build,gradle文件中进行以下更改:
提及插件:
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'
}
创建fatjar:
./gradlew clean fatjar
从/ build / libs /:
运行fatjarjava -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)
如果您正在使用gradle项目,只需将以下内容添加到build.gradle
jar {
manifest {
attributes(
'Main-Class': 'pokerhandscorer.PokerHandScorer'
)
}
}
这会在您的\ build \ libs {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
}
如何使用?
gradle fatJar
//创建fatJar gradle createJar
//创建具有复制依赖关系的jar。更多详细信息:https://jafarmlp.medium.com/a-simple-java-project-with-gradle-2c323ae0e43d