我听人们说过他们创建了一个fat JAR并进行部署,他们实际上是指什么?
我听人们说过他们创建了一个fat JAR并进行部署,他们实际上是指什么?
精简版 - 仅包含您在代码编辑器中直接键入的内容,没有其他东西。
薄版 - 包含上述所有内容,以及应用程序的直接依赖项(数据库驱动程序,实用库等)。
空洞版 - 和薄版相反。它只包含运行应用程序所需的部分,但不包含应用程序本身。基本上是一个预打包的“应用服务器”,您可以稍后将应用程序部署到其中,与传统的Java EE应用服务器类似,但有重要的区别。
肥胖/超级版 - 包含您自己编写的部分加上您应用程序的直接依赖项以及使应用程序能够“独立运行”的组件。
来源:Dzone的文章
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
}
<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>
<project>
...
<build>
...
<plugins>
<plugin>
<!-- NOTE: We don't need a groupId specification because the group is
org.apache.maven.plugins ...which is assumed by default.
-->
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<classifier
</configuration>
...
</project>
更详细的解释请参考:imagej.net上的Uber-JAR
对于可执行的jar文件,关于“fat jar”的另一种理解是可以通过调用来执行的jar文件:
java -jar myFatLibrary.jar
无需使用-cp
/ --classpath
,甚至不需要双击jar图标。
从Gradle文档中:
在Java领域中,应用程序及其依赖项通常被打包为单个分发存档中的独立JAR文件。这仍然会发生,但现在有另一种常见的方法:将依赖项的类和资源直接放入应用程序JAR中,创建所谓的超级或胖JAR。
下面是在build.gradle
文件中演示的uberJar
任务:
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文件树,其内容将与应用程序类一起复制到超级JAR中。一个fat 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);