我听说有人说他们创建了一个胖JAR并进行部署。他们究竟是什么意思?
答案 0 :(得分:76)
fat jar是jar,它包含所有库的类,你的项目所依赖的类,当然还包括当前项目的类。
在不同的构建系统中,fat jar的创建方式不同,例如,在Gradle中,可以使用(instruction)创建它:
task fatJar(type: Jar) {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
baseName = project.name + '-all'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
在Maven中,这样做(在设置常规jar之后):
<pluginrepositories>
<pluginrepository>
<id>onejar-maven-plugin.googlecode.com</id>
<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
</pluginrepository>
</pluginrepositories>
<!-- ... -->
<plugin>
<groupid>org.dstovall</groupid>
<artifactid>onejar-maven-plugin</artifactid>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<onejarversion>0.97</onejarversion>
<classifier>onejar</classifier>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
答案 1 :(得分:8)
对于可执行jar,另一种考虑胖jar的方法是你可以通过调用来执行:
java -jar myFatLibrary.jar
无需-cp
/ --classpath
,甚至双击jar图标。
答案 2 :(得分:6)
Skinny (瘦) –仅包含您在代码编辑器中实际键入的位,并且不包含其他任何内容。
瘦 –包含以上所有内容以及应用对应用的直接依赖关系(数据库驱动程序,实用程序库等)。
空心 –精简的反面–仅包含运行应用程序所需的位,但不包含应用程序本身。基本上是预打包的“应用服务器”,以后可以将其部署到该应用服务器,其样式与传统Java EE应用服务器相同,但有一些重要区别。
Fat / Uber –包含您从字面上为自己编写的内容 PLUS 与应用程序直接依赖的内容 PLUS 运行应用程序所需的位“在其自己的”。
答案 3 :(得分:0)
胖jar包含与经典jar相同的类+所有运行时依赖项中的类。
使用Jeka(https://jeka.dev),您可以通过编程实现它:
JkPathTreeSet.of(Paths.get("classes")).andZips(
Paths.get("bouncycastle-pgp-152.jar"),
Paths.get("classgraph-4.8.41.jar"),
Paths.get("ivy-2.4.0.jar")
).zipTo(Paths.get("fat.jar"));
或仅通过参数化Java插件即可:
javaPlugin.getProject().getMaker().defineMainArtifactAsFatJar(true);
答案 4 :(得分:0)
在Java空间中,应用程序及其依赖项通常用于打包为单个分发归档文件中的独立JAR。仍然发生这种情况,但是现在有另一种常见的方法:将依赖项的类和资源直接放入应用程序JAR中,创建所谓的超级或胖JAR。
这是uberJar
文件中的build.gradle
任务的证明:
task uberJar(type: Jar) {
archiveClassifier = 'uber'
from sourceSets.main.output
dependsOn configurations.runtimeClasspath
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
}
在这种情况下,我们将获取项目的运行时依赖项configurations.runtimeClasspath.files
,并使用zipTree()
方法包装每个JAR文件。结果是一个ZIP文件树的集合,这些树文件的内容与应用程序类一起复制到uber JAR中。