2014-02-24 150 views
0

我目前在Maven中構建EAR文件。當我建立它,我得到以下我的目標文件夾:將EAR中的所有依賴項移至Maven中的子文件夾

-target/ 
    -MyProject.ear 
    -MyProject/ 
     -MainProject.jar 
     -Dependency.jar 

如果我在7Zip的開拓MyProject.ear,我看到了存在於MyProject/

我被要求更改此相同的文件結構讓所有的依賴是一個子文件夾,如:

-target/ 
    -MyProject.ear 
    -MyProject/ 
     -MainProject.jar 
     -lib/ 
      -Dependency.jar 

現在我可以進行以下更改到我的pom.xml文件,使這項工作對於一個依賴

<build> 
    [...] 
    <plugins> 
     <plugin> 
      <artifactId>maven-ear-plugin</artifactId> 
      <version>2.9</version> 
      <configuration> 
       <modules> 
        <jarModule> 
         <groupId>Dependency</groupId> 
         <artifactId>Dependency</artifactId> 
         <bundleDir>lib</bundleDir> 
        </jarModule> 
       </modules> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

但是在真實的項目中,我有大約30個依賴關係。我可以爲每個依賴項手動添加一個<jarModule>標記,但理想情況下,我希望它自動將所有依賴項移動到子目錄(排除MainProject.jar)。

我希望我能一次聲明<jarModule>和使用的groupId和artifactId的,like Maven allows with exclusions通配符:

<!-- Moving all for the time being, add the exclusion if it works --> 
<jarModule> 
    <groupId>*</groupId> 
    <artifactId>*</artifactId> 
    <bundleDir>lib</bundleDir> 
</jarModule> 

我希望上面採取一切文物,並把它們放到一個lib文件夾。 Unfortunatley,這似乎並沒有在Maven 3.2.1中工作,提供一個錯誤說Artifact[jar:*:*] is not a dependency of the project

那麼在Maven中構建EAR時,如何將所有依賴關係移動到子文件夾?

回答

0

由於在測試後未能完全清理我的pom文件,我發現如何做到這一點。

<configuration>標記中,添加<defaultLibBundleDir>/lib</defaultLibBundleDir>。這將默認將所有模塊放在目錄根目錄下的lib文件夾中。不需要通配符;實際上,Maven在這部分中不支持通配符,可能是因爲沒有明確的界限(可能被解釋爲「永遠移動所有工件」)。通配符僅適用於排除,因爲有明確的界限;它是一組明確定義的工件的子集。

如果您想要例外,請指定模塊並鍵入<bundleDir>/</bundleDir>,然後將其放回根目錄。完整的XML看起來是這樣的:

<build> 
[...] 
<plugins> 
    <plugin> 
     <artifactId>maven-ear-plugin</artifactId> 
     <version>2.9</version> 
     <!-- All dependencies not otherwise specified are going in /lib --> 
     <defaultLibBundleDir>/lib</defaultLibBundleDir> 
     <modules> 
     <jarModule> 
      <!-- An exception to keep the main project in the root --> 
      <groupId>MainProject</groupId> 
      <artifactId>MainProject</artifactId> 
      <bundleDir>/</bundleDir> 
     </jarModule> 
     </modules> 
    </configuration> 
    </plugin> 
</plugins> 

這將導致把所有依賴於lib文件夾中,除了MainProject.jar原來的目標:

-target/ 
    -MyProject.ear 
    -MyProject/ 
     -MainProject.jar 
     -lib/ 
      -Dependency.jar 
+0

那麼這個訣竅在我的回答中已經提到了否?也許你可以接受它,因爲它有助於找出解決方案,thx。 – tmarwen

+0

@tmarwen您的回答包含''標籤,這是正確解決方案的必要組件,但通配符不正確,最終解決方案無法正常工作。因爲它不是一個有效的解決方案,所以我會接受這個,因爲它對我和希望其他人都有效。 – Thunderforge

+0

對不起,通配符是用你的jar組替換的,工件ID不能放在原來的位置......我的技巧是在** maven-ear-plugin **配置下添加'' 。 – tmarwen

0

你應該在你的行家入耳式插件移動捆綁目錄限制生成配置如下:

<build> 
<finalName>${project.artifactId}</finalName> 
<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-ear-plugin</artifactId> 
    <version>${maven-ear-plugin.version}</version> 
    <configuration> 
     <modules> 
     <jarModule> 
      <groupId>${group_id}</groupId> 
      <artifactId>${artifact_id}</artifactId> 
      <bundleDir>lib</bundleDir> 
     </jarModule> 
     <webModule> 
      ... 
     </webModule> 
     </modules> 
     <defaultLibBundleDir>/lib</defaultLibBundleDir> 
    </configuration> 
    </plugin> 
</plugins> 

希望它能幫助。

+0

這沒有奏效。我完全複製了它(並且將版本更改爲硬編碼版本,因爲我沒有該屬性),但仍然出現錯誤'Artifact [jar:*:*]不是項目的依賴項「 – Thunderforge

+0

jar模塊作爲您的企業項目的**依賴項**? – tmarwen

+0

是的,我已經聲明它們是依賴關係。如果我嘗試製作EAR而不嘗試將它們移動到lib文件夾中,則會生成所有內容。當我運行'mvn package'時,沒有錯誤或缺失依賴或任何東西。事實上,如果他們不是依賴關係,我不認爲我在原始問題中展示的結果會發生。 – Thunderforge

相關問題