什么是脂肪JAR?
我听说有人说他们创build了一个胖JAR并部署它。 他们究竟是什么意思?
fat jar是jar,它包含了所有库的类,你的项目所依赖的类,当然还有当前项目的类。
在不同的构build系统中,fat jar的创build方式是不同的,例如,在Gradle中,可以用( 指令 )创build它:
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>
Fat jar或uber jar是一个包含所有项目类文件和资源以及所有依赖关系的jar包。 有不同的方法可以达到这样的效果:
- 依赖'的jar子被复制到主jar,然后使用特殊的类加载器(onejar)
- 依赖关系的jar被提取到主jar层次结构的顶部(maven-assembly-plugin与jar-with-dependencies程序集,maven-shade-plugin和shade目标)
下面的样例程序集插件configurationjar -with-dependencies :
<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>
在一个可执行的jar的情况下,另一种思考一个胖jar的方法是你可以通过调用来执行:
java -jar myFatLibrary.jar
而不需要-cp
/ --classpath
,甚至双击jar图标。