Что такое жирная банка?


Я слышал, как люди говорят, что они создают жирную банку и развернуть его. Что они на самом деле означают ?

3 77

3 ответа:

жирная банка-это банка, которая содержит классы из всех библиотек, от которых зависит ваш проект и, конечно же, классы текущего проекта.

в разных системах сборки fat jar создается по-разному, например, в Gradle можно было бы создать его с помощью ( - инструкции):

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>

Fat jar или uber jar-это jar, который содержит все файлы класса проекта и ресурсы, упакованные вместе со всеми его зависимостями. Существуют различные способы достижения такого эффекта:

  • банки зависимостей копируются в основную банку, а затем загружаются с помощью специального загрузчика классов (onejar)
  • банки зависимостей извлекаются в верхней части основной иерархии jar (maven-assembly-plugin с его сборкой jar-with-dependencies, maven-shade-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>

в случае исполняемого jar другой способ думать о fat jar - это тот, который вы можете выполнить, вызвав:

java -jar myFatLibrary.jar

без -cp/--classpath, или даже дважды щелкните значок банки.