2015-01-24 3 views
3

В моем проекте Maven я пробовал плагин maven-shade для создания uber jar, когда я запускаю mvn package. В результате я получаю три банки в моей целевой директории:В чем разница между банками, создаваемыми плагином Maven's Shade?

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

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

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

Вот мой ПОМ файл:

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

Затемненных банков переименовывать библиотеки/банки, чтобы избежать проблем пространства имен, насколько мне известно. Например, предположим, что вы работаете над кодовой базой со многими пакетами. Некоторые пакеты могут использовать одни и те же библиотеки, но разные версии. Использование заштрихованных банок помогает избежать неудач с загрузкой неправильной версии библиотеки. – mauzel

ответ

0

Я скопировал свой POM в проект шахты и получил только две банки, созданные когда я побежал mvn package.

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

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

<shadedClassifiedName>shaded</shadedClassifiedName> 
Смежные вопросы