2014-09-04 31 views
3

我在一個多模塊Maven項目中轉換單個Eclipse Maven託管的webapp項目(這是一個用Maven實驗的測試項目,所以請隨時提供任何類型的建議)。Maven多模塊:組裝錯誤WAR:需要webxml屬性

單個項目webapp沒有任何錯誤,在部署時成功編譯並且行爲正確,所以我從一個可用的應用程序開始。

該應用程序有一個Web部件和一個控制檯部分,這意味着有一些類有一個main()方法,當從Eclipse內部運行時(Run as - > Java Application)按預期工作。兩個部分均顯示來自數據庫的數據,通過JDBC直接查詢或通過jOOQ查詢。

所以,我這是怎麼拆分項目:

  • 核心(持有共同的一切其他兩個部分);
  • 可運行(包含具有main()方法的類);
  • webapp(web應用程序部分)。

在Eclipse,我現在有4個獨立的項目:

  • shaker-multi保持聚合器(和親本)POM,加在一個子目錄中的每個模塊;
  • shaker-multi-core;
  • shaker-multi-runnable;
  • shaker-multi-webapp

在Eclipse中,核心的webapp編譯,而後者可以部署到Tomcat實例,我可以看到它在瀏覽器中。

問題出現在可運行。該項目依賴於jOOQ類,因此必須生成相關的源代碼。 jOOQ的依賴關係和配置在core/pom.xml(因爲它們也可能在那裏使用)。

當我做項目 - >運行方式 - > Maven構建... - >clean generate-sources,在shaker-multi-core我得到:

Non-resolvable parent POM: Failure to find sunshine.web:shaker-multi:pom:0.0.1

這聽起來很合理,因爲我沒有安裝任何的文物,即使在我的本地存儲庫中。

但是,當我打電話Maven構建... - >上shaker-multi「乾淨安裝」,它打破了,因爲它無法找到web.xml文件shaker-multi-webapp(儘管它正確地駐留在shaker-multi-webapp/src/main/webapp/WEB-INF/web.xml)。

我該怎麼辦? 我的項目配置/拆分是完全錯誤的嗎? 我應該添加其他模塊與父POM?這聽起來是錯誤的,因爲POM參考指出:

繼承和聚合創建一個很好的動態來控制通過單個高級POM的構建。 你會經常看到父母和聚合者項目

我完全迷失在這裏。

我的期望:

  • shaker-multi-webapp運行Maven package並獲得部署戰爭;
  • 運行Maven package on shaker-multi-runnable並獲得一個可運行的命令行jar(我仍然需要配置它的POM來生成一個jar -with-dependencies,雖然我知道);
  • 運行Maven packageshaker-multi並獲得某種的,我可以四處移動,並且將包含戰爭或每個模塊的罐子

編輯

我加

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <configuration> 
      <webXml>src/main/webapp/WEB-INF/web.xml</webXml>   
      </configuration> 
     </plugin> 

shaker-multi-webapp POM,如this answer看到的,但沒有什麼區別。


EDIT 2

我清除了我的整個本地存儲庫(如建議here),當我重新開放的Eclipse,在Maven控制檯只見

[...] 
05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/main/java 
05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/test/java 
**05/09/14 07:58:19 CEST: [ERROR] Could not read web.xml** 
[...]

任何提示?它從哪裏來?我不能重現它(但不刪除我的整個本地回購)。


這是shaker-multi POM:

<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>sunshine.web</groupId> 
    <artifactId>shaker-multi</artifactId> 
    <version>0.0.1</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>shaker-multi-core</module> 
     <module>shaker-multi-runnable</module> 
     <module>shaker-multi-webapp</module> 
    </modules> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <encoding>UTF-8</encoding> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

這是shaker-multi-core POM:

<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/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>sunshine.web</groupId> 
     <artifactId>shaker-multi</artifactId> 
     <version>0.0.1</version> 
    </parent> 

    <artifactId>shaker-multi-core</artifactId> 
    <packaging>jar</packaging> 

    <build> 
     <plugins> 
      <plugin><!-- jOOQ plugin--></plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency><!-- jOOQ dependency --></dependency> 
    </dependencies> 

</project> 

這是shaker-multi-webapp POM:

<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/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>sunshine.web</groupId> 
     <artifactId>shaker-multi</artifactId> 
     <version>0.0.1</version> 
    </parent> 

    <artifactId>shaker-multi-webapp</artifactId> 
    <packaging>war</packaging> 

    <build> 
     <plugins> 
      <plugin><!-- Tomcat local --> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>sunshine.web</groupId> 
      <artifactId>shaker-multi-core</artifactId> 
      <version>0.0.1</version> 
     </dependency> 


     <dependency> 
      <!-- JSP & Servlet dependencies --> 
     </dependency> 

    </dependencies> 
</project> 

回答

0

這裏的整個問題是很簡單的,我覺得有點慚愧,是因我第一次做了一個多–模塊項目,我想這可能發生。

當然,這裏的細節在您自己處理所有項目和模塊源代碼時都適用:如果您在團隊中,只處理項目的一部分和/或使用集中式私有存儲庫,那麼因人而異。

首先我之後分裂單一–項目分成幾個模塊,這是在我的Eclipse項目資源情況:

+-- shaker-multi 
     ^--- pom.xml 
     ^--- shaker-multi-core 
        ^-- pom.xml 
        ^-- (other content) 
     ^--- shaker-multi-runnable 
        ^-- pom.xml 
        ^-- (other content) 
     ^--- shaker-multi-webapp 
        ^-- pom.xml 
        ^-- (other content) 

+-- shaker-multi-core 
      ^-- pom.xml 

+-- shaker-multi-runnable 
      ^-- pom.xml 

+-- shaker-multi-webapp 
      ^-- pom.xml 

每個+--是單一的,分離的,Eclipse項目。他們每個人都從SVN中單獨檢出(所以他們實際上是相互分離的)。
然後,我編輯+-- shaker-multi-runnable中的一些內容,並期望在我運行Maven時工作,而不需要svn –提交前者,svn –更新後者。

這就是爲什麼我不斷收到這個問題的錯誤!

來處理這類項目的正確方法,如果他們來自一個原本龐大的項目是:

  • 到子文件夾中的代碼,資源等分裂;
  • 將每次更改提交到存儲庫;
  • 在Eclipse中清除每個涉及的項目

接下來,在IDE的SVN Repositories選項卡中去,擴大與現在分裂項目儲備庫,做好退房作爲Maven項目父–項目(即具有模塊,子文件夾中的一個)的
如果你像我一樣正在使用Subclipse的最新版本,則需要Maven Eclipse (m2e) SCM connector for subclipse 1.10 (svn 1.8) - update site(感謝請參閱buluschek development,請參閱該帖子的最新評論),以便您可以從Check中選擇存儲庫路徑作爲Maven Project對話框。

有了它,你會自動告訴Eclipse籤從父文件夾中的整個項目,而Eclipse:

  1. 獲取所有Maven項目模塊;
  2. 創建與父項目–相對應的項目,其中模塊是子文件夾;
  3. 會爲每一個模塊一個單獨的項目
  4. 聯繫在一起每個模塊項目與父項目,以便在模塊的源代碼,資源,POM等每個編輯的父文件夾內立即反映-項目。

這點(4)在這裏是關鍵:儘管有幾個項目,但它們已經鏈接在一起(我猜測手動檢出每個模塊文件夾時也可以做到這一點,儘管我不知道如何) 。

完成此操作後,我所有的Maven問題都消失了。

2

我承擔你的文件夾結構是這樣的:

+-- shaker-multi 
     +--- pom.xml 
     +--- shaker-multi-core 
        +-- pom.xml 
     +--- shaker-multi-runnable 
        +-- pom.xml 
     +--- shaker-multi-webapp 
        +-- pom.xml 
  1. 而且你應該檢查如果您的項目在Eclipse中正常工作的指揮和 。所以,你應該去你的項目 (振動篩,多文件夾)的根和

    MVN清潔套裝

    這應該不會產生誤差等

    它進入我的腦海
  2. 一件事是爲什麼您是否使用發佈版本而不是 SNAPSHOT版本用於您的項目。那麼0.0.1而不是0.0.1-SNAPSHOT

  3. ,你應該改善的事物是Maven的編譯器插件 在你父母的definintion:

我會建議做這種方式:

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <encoding>UTF-8</encoding> 
       </configuration> 
      </plugin> 
     </plugins> 
     </pluginManagement> 
    </build> 
  1. 編碼可以更好地解決just define the following in your pom
<project> 
    ... 
    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    ... 
</project> 

以上將定義的默認值很多插件像Maven的編譯器插件, Maven的資源,插件等

  1. 部分從您的結構看起來不錯...一個小的改進,我會 建議是,如果你定義模塊之間的依賴關係:
<dependencies> 
     <dependency> 
      <groupId>sunshine.web</groupId> 
      <artifactId>shaker-multi-core</artifactId> 
      <version>0.0.1</version> 
     </dependency> 


     <dependency> 
      <!-- JSP & Servlet dependencies --> 
     </dependency> 

    </dependencies> 

我會建議DEFI NE間模塊依賴關係是這樣的:

<dependencies> 
     <dependency> 
      <groupId>sunshine.web</groupId> 
      <artifactId>shaker-multi-core</artifactId> 
      <version>${project.version}</version> 
     </dependency> 


     <dependency> 
      <!-- JSP & Servlet dependencies --> 
     </dependency> 

    </dependencies> 
+0

你介意給你的問題/建議添加數字或字母引用,所以我可以在我的評論中引用他們嗎? – watery 2014-09-05 10:47:15

+0

1)感謝您的建議; 2)沒有特別的原因;我對Maven學習採取緩慢的態度; 3),4)和5)這很好!除此之外,我的設置並沒有什麼錯,問題是'shaker-multi'包含聚集器 - 父 - POM旁邊的所有模塊源,而在我的Eclipse工作區中,每個人都有一個單獨的項目子模塊。但是我對單個項目進行了更改,但沒有將它們提交給svn並將它們放回到aggregator-project中,因此對後者的'mvn install'失敗,因爲實際上沒有'web.xml'文件。 – watery 2014-09-05 22:40:51

+0

爲了清晰起見,我會更新我的問題,並儘快爲技術說明添加答案。但你的答案包含preciuos的建議,所以+1是真正值得的! – watery 2014-09-05 22:41:56

相關問題