2013-10-03 15 views
59

Ho sentito dire che creano un JAR grasso e lo distribuiscono. Cosa significano in realtà?Cos'è un JAR grasso?

+0

quando si desidera spedire il prodotto come jar normalmente si desidera mettere le classi in tutti i jar dipendenti in un unico file jar grande. – 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- domande – eis

+2

La risposta originale stava indicando questo collegamento: http://www.javacodegeeks.com/2012/11/packing-your-java-application-as-one-or-fat-jar.html –

risposta

50

Il barattolo di grasso è il barattolo, che contiene le classi di tutte le librerie, da cui dipende il progetto e, naturalmente, le classi del progetto corrente.

In diversi vaso sistemi di compilazione grasso viene creato in modo diverso, ad esempio, in Gradle uno creerebbe con (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 
} 

In Maven è stato fatto in questo modo (dopo aver impostato barattolo regolare):

<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

Quindi "jar grasso" è solo un altro nome per "uber jar"? – gturri

+6

@gturri Sì, esattamente. –

+2

Perché utilizzare alcuni plug-in di terze parti quando è presente un plug-in di assembly Maven con l'assembly jar-with-dependencies? – MeTTeO

8

Il vaso di grasso o il vaso uber è un contenitore che contiene tutti i file di classe del progetto e le risorse imballate insieme con tutte le sue dipendenze. Esistono diversi metodi per ottenere tale effetto:

  • dipendenze vasetti vengono copiate nel vaso principale e poi caricati utilizzando speciali classe loader (onejar)
  • dipendenze vasetti vengono estratti nella parte superiore della gerarchia vaso principale (maven aSSEMBLAGGIO-plugin con il suo vaso-con-dipendenze assemblaggio, Maven-ombra-plugin con obiettivo ombra)

Qui di seguito campione di assemblaggio di configurazione del plugin 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

Nel caso di un jar eseguibile, un altro modo di pensare a un barattolo di grasso è quella che si può eseguire invocando:

java -jar myFatLibrary.jar 

senza la necessità di -cp/--classpath, o anche fare doppio clic sull'icona vaso.

+0

Ricordare che -jar richiede l'intestazione Main-Class in MANIFEST.MF : https://docs.oracle.com/javase/tutorial/deployment/jar/run.html – MeTTeO

+0

Questo è il caso anche per i barattoli non grassi, quindi non rilevanti in realtà. –