В чем разница между банками, созданными плагином Maven Shade?

В моем проекте Maven я попробовал плагин maven-shade-plugin для создания uber jar при запуске mvn package. В результате я получаю три банки в моем целевом каталоге:

original-hello-world-0.1.0-SNAPSHOT.jar
hello-world-0.1.0-SNAPSHOT.jar
hello-world-0.1.0-SNAPSHOT-shaded.jar

Я понимаю, что первая банка - это вывод упаковки без включения зависимостей. Но и вторая, и третья банки включают зависимости и кажутся полностью идентичными (оба имеют одинаковый размер файла).

Должна ли быть разница между второй и третьей банками? Если так, то, что это? Иначе зачем производятся две одинаковые банки?

Вот мой файл pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>mygroup</groupId>
  <artifactId>myproject</artifactId>
  <packaging>jar</packaging>
  <version>0.1.0-SNAPSHOT</version>
  <name>hello-world</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.7</java.version>
    <main.class>org.example.HelloWorld</main.class>

    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.compiler.source>${java.version}</maven.compiler.source>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.jgrapht</groupId>
      <artifactId>jgrapht-core</artifactId>
      <version>0.9.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- To build executable jar -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <manifestEntries>
                    <Main-Class>${main.class}</Main-Class>
                  </manifestEntries>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <!-- To use Maven to run main class -->
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.3.2</version>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>${main.class}</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

person anishpatel    schedule 24.01.2015    source источник
comment
Затененные банки переименовывают библиотеки/банки, чтобы избежать проблем с пространством имен, на самом деле. Например, предположим, что вы работаете над кодовой базой со многими пакетами. Некоторые пакеты могут использовать одни и те же библиотеки, но разные версии. Использование затемненных банок помогает избежать ошибок при загрузке неправильной версии библиотеки.   -  person mauzel    schedule 25.01.2015


Ответы (1)


Я скопировал ваш pom в свой проект и создал только две банки, когда запустил mvn package.

Вы уверены, что jar «hello-world-0.1.0-SNAPSHOT-shaded.jar-shaded» не является результатом предыдущего запуска maven? Пожалуйста, попробуйте mvn clean package и проверьте, что попадает в целевую папку.

Если вам нужна дополнительная банка с тегом «-shaded», вы можете добавить следующее в свой pom в конфигурации плагина тени:

<shadedClassifiedName>shaded</shadedClassifiedName>
person JHowIX    schedule 25.08.2015