2011-04-19 199 views
13

對不起,在這裏聽起來很無知,但我是Maven的新手,並且一直對我的頭反抗,我敢肯定它很簡單。maven assembly插件問題開始

docs說:

[...]一個項目可能產生包含在根目錄下,在一個lib /目錄下的運行時依賴一個項目的JAR神器一個ZIP組件和shell腳本啓動一個獨立的應用程序。

這就是究竟是我想幹什麼!但我似乎無法做到這一點。

我POM如下:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.anearalone</groupId> 
    <artifactId>myapp</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    [...] 
    <build> 
     <finalName>myapp</finalName> 
     <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.1</version> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
       <configuration> 
        <descriptors> 
        <descriptor>src/main/assemble/dist.xml</descriptor> 
        </descriptors> 
        <archive> 
        <manifest> 
         <mainClass>com.anearalone.myapp.CLI</mainClass> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
        </manifest> 
        </archive> 
       </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
</build> 
[...] 
</project> 

和引用dist.xml看起來是這樣的:

<assembly> 
    <id>dist</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <files> 
     <file> 
     <outputDirectory>/</outputDirectory> 
     <source>src/main/bin/arkify.sh</source> 
     <fileMode>755</fileMode> 
     </file> 
    </files> 
    <dependencySets> 
     <dependencySet> 
     <useProjectArtifact>false</useProjectArtifact> 
      <includes> 
      <include>*:jar</include> 
      </includes> 
      <outputDirectory>/lib</outputDirectory> 
     </dependencySet> 
     <dependencySet> 
     <useProjectArtifact>true</useProjectArtifact> 
     <includes> 
      <include>com.anearalone:myapp:jar:0.0.1-SNAPSHOT</include> 
     </includes> 
     <outputDirectory>/</outputDirectory> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

這實現了我想在壓縮文件的佈局(雖然我很確定我沒有以正確的方式到達那裏),但我在target/(一個在zip存檔中,另一個在根目錄中)中有兩個罐子,並且它們都不包含我的mainClass條目在結果MANIFEST.MF中。

如果我改變project.packaging爲「POM」,我認爲可能是正確的,當然額外的罐子(在target/根消失了,但我得到這些警告:

[WARNING] Cannot include project artifact: com.anearalone:myapp:pom:0.0.1-SNAPSHOT; it doesn't have an associated file or directory. 
[WARNING] The following patterns were never triggered in this artifact inclusion filter: 
o 'com.anearalone:myapp' 

.. 。其實我心裏想的工件不在存檔,還有沒有加入到MANIFEST.MF條目。

任何人有時間來幫幫忙初學者?

回答

9

如果我正確理解你的問題,你的郵政編碼是正確的ly創建的,但其中包含的my-app-0.0.1-SNAPSHOT(以及JAR直接位於target/目錄中)不包含MANIFEST.MF文件中的主類?

實際上,assembly插件並不專用於執行此類任務。這是JAR plugin的任務,其提供了在MANIFEST.MFthe main class of your project中指示的方式。您只需必須添加這個配置在目前pom.xml

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    ... 
    <configuration> 
     <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
      <mainClass>my.app.MainClass</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    </plugin> 
</plugins> 

關於你嘗試在項目的包裝更改爲pom包裝:這是一個壞主意;)事實上,pom包裝用於沒有除pom.xml本身以外的任何其他資源的項目。對於定義爲the parent of others projects或的pom.xml非常有用。

+1

啊,完美!我應該從[使用頁面](http://maven.apache.org/plugins/maven-assembly-plugin/usage.html)的前幾行中推斷出這一點。非常感謝! – JStroop 2011-04-19 13:25:46