2013-10-03 65 views
59

我听到有人说他们创建了一个胖JAR并部署它。他们究竟意味着什么?什么是脂肪JAR?

+0

当您想将产品以jar的形式发货时,您通常希望将所有依赖jar中的类放入一个大jar文件中。 – Nishu

+0

@Nadeem_MK http://meta.stackexchange.com/questions/5280/embrace-the-non-googlers http://meta.stackexchange.com/questions/8724/how-should-we-deal-with-google-问题 – eis

+2

原来的答案是指向这个链接:http://www.javacodegeeks.com/2012/11/packing-your-java-application-as-one-or-fat-jar.html –

回答

50

fat jar是jar,它包含所有库的类,你的项目依赖于这些类,当然还有当前项目的类。

在不同的编译系统的脂肪罐子创建不同的,例如,在摇篮一个将与(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的它正在做这样(设置常规罐子后):

<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> 
+12

那么“fat jar”就是“uber jar”的另一个名称吗? – gturri

+6

@gturri是的,正好。 –

+2

为什么使用一些第三方插件时有maven assembly插件与jar-with-dependencies程序集? – MeTTeO

8

胖jar或uber jar是一个jar包含所有项目类文件和资源与所有它的依赖关系打包在一起。有用于实现这样的效果不同的方法:

  • 依赖性罐子被复制到主罐,然后使用特殊的类装载程序(onejar)
  • 依赖加载罐子在主罐层次结构的顶部(行家萃取 - 装配 - 插件与它的罐子,有依赖性组装,行家遮阳帘插件带灯罩的目标)

下面的示例组件插件配置jar-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> 
4

在一个可执行的JAR的情况下,另一种方式来思考脂肪罐子是一个你可以通过调用执行:

java -jar myFatLibrary.jar 

无需-cp/--classpath,甚至双击图标罐子。

+0

请记住,-jar需要MANIFEST.MF中的Main-Class标题:https://docs.oracle.com/javase/tutorial/deployment/jar/run.html – MeTTeO

+0

甚至对于非脂肪罐也是如此,所以不相关。 –