簡體   English   中英

如何繼承多模塊Maven項目及其所有好處?

[英]How to inherit from a multimodule Maven project with all its goodies?

我無法找到一個好的,可擴展的解決方案的問題:

我有一個項目,可以提供給定工件的多種風格。 這已被設置為多模塊項目,目前有3個模塊:

  • / flavour1_module
  • / flavour2_module
  • / flavour3_module

問題是我還有另外50個需要以相同方式設置的項目,即提供3種口味。

解決方案:

  1. 將已創建的多模塊項目轉換為所有其他50個項目的父項目
    • 缺點:它不起作用。 與父模塊一起保存的指令不會被繼承,因此不會執行它們。
  2. 使用maven-archetype-plugin創建一個多模塊項目模板 ,然后根據模板創建所有50個項目
    • 缺點:如果我需要flavour4,我需要手動更新所有50個項目以添加flavour4_module(並復制其內容)。 不可擴展。
  3. 將所有flavor的配置嵌入到單個pom中,並根據配置文件啟用或禁用它們(即使用配置文件組合而不是通過模塊繼承)。 然后將50個項目指向它,作為它們的父項。 這將創建“內聯”模塊
    • 缺點:我需要在我自己的機制上實現,這些機制由開箱即用的模塊提供。 (例如,在單獨的目錄中構建每個風味)。 我也會失去模塊提供的明確分離。

任何想法如何做得很好? 還有其他選擇嗎?

謝謝,盧卡斯

編輯:

另一個選擇是使用reactor擴展maven-reactor-plugin :inject-modules目標,它將從外部工件下載模塊定義,並將其定義附加為普通模塊。 這將動態創建一個新模塊。 然后所有50個項目都可以使這個pom.xml成為他們的父項。

配置看起來像這樣(草稿):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-reactor-plugin</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <id>inject</id>
      <phase>initialize</phase>
      <goals>
        <goal>inject-modules</goal>
      </goals>
      <configuration>
        <modules>
          <module>
            <artifactId>flavour1_module</artifactId>
            <groupId>[ groupId ]</groupId>
            <version>[ version ]</version>
          </module>
          <module>
            <artifactId>flavour2_module</artifactId>
            <groupId>[ groupId ]</groupId>
            <version>[ version ]</version>
          </module>
          <module>
            <artifactId>flavour3_module</artifactId>
            <groupId>[ groupId ]</groupId>
            <version>[ version ]</version>
          </module>
        </modules>
      </configuration>
    </execution>
  </executions>
</plugin>

這樣做會有意義嗎?

更新:

編寫一個操作要執行的模塊列表的插件(我上面描述的模塊注入的概念)似乎不可能實現,因為模塊由maven核心處理,並且該機制不是為擴展而設計的一個插件。 事實證明,兩個插件都執行類似的工作,即操作要執行的項目列表:

通過執行系統調用來創建maven子進程。 對我而言,這不是一條路,因為這是一個非常不穩定的解決方案。 事實上, maven-reactor-plugin與Maven3 不兼容

maven-invoker-plugin仍然看起來很有前途。 該插件最初設計用於運行集成測試,但可以使用它來擴展例如編譯階段。 但它需要將子pom.xml-s視為資源並在運行中進行修改。 對於我在這里描述的問題,解決方案太復雜和不穩定。 在構建maven模型時,我更喜歡可以在內存中運行的更輕的東西。

所以現在我使用配置文件,試圖使它們盡可能緊湊。 可能有一段時間我需要再次思考這個問題。

現在,您可以使用maven-tiles插件來獲得所需的行為。

使用maven-tiles,您可以在不同的poms中定義構建行為,並將它們導入到您喜歡的任何位置。

有一個工作樣本附加到MNG-5102 - > daddy3.zip

Maven的繼承唯一的緊身夾克現已正式刪除。

在我看來,你可以為此創建多個不同的程序集描述符,並配置多個插件執行,每次執行都引用不同的描述符。 您必須將項目維護為單個模塊而不是多模塊項目。 如果您的發行版包含相同的類集但不同的資源或庫,它可以工作。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <id>assembly</id>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                                <descriptor>one.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
                <execution>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <id>assembly</id>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                                <descriptor>two.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
                <execution>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <id>assembly</id>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                                                      <descriptor>three.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>

您可以使用在那里配置的程序集來創建父pom,以便您可以從那里控制分發數量和包裝更改。 您的項目無需了解不同包裝的詳細信息。

我強烈建議將本機庫保留為單獨的模塊,並使用存儲庫機制將已編譯的庫安裝到其中。 您可以使用不同的分類器來隔離平台,例如

mylib-2.0.0-win32_x86.dll
mylib-2.0.0-linux_x86.so
mylib-2.0.0-linux_x86_64.so

然后,您可以在項目中引用這些庫作為依賴項,然后將它們與您的發行版一起打包。

總體解決方案將在很大程度上取決於各種分布的不同以及包裝分發的整個過程,但我認為這將有效。

最終和更具可擴展性的解決方案是通過實施Maven插件來創建自己的包裝。

根據我的經驗, 選項3工作得最好,但我沒有必要像你需要那樣擴展它 - 當我必須這樣做時我已經使用maven-ant-plugin來創建一個參數化的ant腳本來做定制。 它有一些缺點 - 即同時使用ant和maven,因此實際的POM更難以理解,但它確實允許比maven更多的靈活性。

如果您使用的是maven 3,則可以定義父pom的配置文件,並根據文件存在情況激活它們。 在子模塊上,只需創建空文件即可“繼承風味”。

這在以下鏈接中有更好的記錄:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM