2016-04-12 59 views
0

我的pom.xml包含以下內容來創建一個包含所有依賴關係的項目jar。
現在我有一個屬性文件src/main/resources這是運行應用程序所必需的(我想從IDE開始使用它),但我不想將它發佈到創建的jar文件中,因爲這些設置被保留分別。從jar中刪除文件與jar -with-dependencies構建

問題:我如何獲得一個包含所有依賴項的文件,但排除那些屬性文件?

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>make-jar</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>x.Main</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </execution> 
+0

爲什麼使用* maven-assemby-plugin *構建JAR而不是標準的* maven-jar-plugin *? – aribeiro

+2

@aribeiro因爲jar插件只會打包項目工件(代碼和資源)而沒有它的依賴關係,所以OP需要一個超級/胖jar代替 –

+0

@ A.DiMatteo感謝啓發。我的眼睛被卡在「不想運送物業」部分,並沒有注意到「依賴」部分。 – aribeiro

回答

1

正如maven-assembly-plugin文件規定:

如果您的項目要打包神器在尤伯杯罐子,組裝插件只提供基本的支持。要獲得更多控制權,請使用Maven Shade插件


使用maven-shade-plugin你可以有一個罐子脂肪(如使用組裝插件),並通過配置(無需外部組件描述符文件的)解決排除文件的類似問題。

對於您的情況,要從組合的瓶子中排除資源,您可以使用shade filters

一個簡單的配置看起來像:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <filters> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>**/*file_pattern*</exclude> 
           </excludes> 
          </filter> 
         </filters> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

在上面的例子中,你可以自定義file_pattern或使用my.groupId:my.artifactIdartifact元素縮小您的過濾器。


注:不包括外部庫文件時,建議使用上述方法,但你仍然可以使用maven-assembly-plugin對於通過自定義assembly descriptor文件不包括你自己的項目文件。

+0

謝謝。之前聽說過樹蔭 - 接下來會看看它! –

+0

@EugeneBeresovsky我剛剛意識到(我的壞)你想從你自己的項目中排除一個文件,而不是從外部依賴。您仍然可以使用該組件插件是,請您分享作爲問題的一部分,目前正在使用的裝配描述符,以提供兩個選項 –

2

如果你想堅持使用Maven的組裝插件,您可以使用,您在本節配置過濾器,像一個裝配描述符文件:

<fileSets> 
<fileSet> 
    <directory>${basedir}</directory> 
    <includes> 
    <include>*.txt</include> 
    </includes> 
    <excludes> 
    <exclude>*.properties/exclude> 
    </excludes> 
</fileSet> 

而在你的Maven配置, pom.xml的指定assemblu描述符文件,在描述符標籤(distribution.xml是含有從上述部分的文件)

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <filters> 
     <filter>src/assembly/filter.properties</filter> 
     </filters> 
     <descriptors> 
     <descriptor>src/assembly/distribution.xml</descriptor> 
     </descriptors> 
    </configuration> 
    </plugin> 

另請查看此鏈接maven-assembly

+0

事實上,這是去,如果你想繼續使用該組件插件的方式,我錯過了它是來自當前項目而不是來自外部依賴項的文件。好點,加1! –

+0

謝謝。此外,感謝您與陰影插件分享您的解決方案。將來可能會有所幫助。 – dumitru