2010-11-29 119 views
2

我剛開始在項目中使用Maven。我所有的生產代碼當然都在主目錄之內。當我將單元測試添加到我的測試目錄中時,有沒有辦法將main目錄與我的tests目錄同步?Maven - 與「測試」文件夾同步「主」文件夾

例如,假設我添加了一個新包org.bio.mynewpackage。我必須進入我的主文件夾並添加相同的軟件包名稱...這很煩人。

任何想法?

+1

你在用什麼IDE?這聽起來就像它可能爲你做的那樣。 (Maven不在乎; *它的工作尤其是`target`目錄的內容的生產,這樣你就可以專注於你的來源...) – 2010-11-29 09:03:22

回答

1

這是一個嵌入在GMaven plugin執行中的Groovy腳本。它完全符合你的要求。

<plugin> 
    <groupId>org.codehaus.gmaven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
      <id>mirror-folder-structure</id> 
      <phase>generate-test-sources</phase> 
      <goals> 
       <goal>execute</goal> 
      </goals> 
      <configuration> 
       <source> 
          <![CDATA[ 
static void createShadow(File base, File shadow){ 
    if(base.exists()&&!shadow.exists())shadow.mkdirs(); 
    base.eachDir { createShadow(it, new File(shadow, it.name))}; 
} 
createShadow(pom.build.sourceDirectory,pom.build.testSourceDirectory); 
          ]]> 
       </source> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

問題是:它不會自動運行。我已將它綁定到階段generate-test-sources,但您可以選擇任何其他階段。然而,您必須手動執行該階段,例如, mvn generate-test-sources

但是,如果您要考慮將Eclipse與m2eclipse插件一起使用,那麼m2eclipse允許您定義在保存文件時自動運行的生命週期階段,這樣會更容易。

0

我不知道我是否正確地解決了問題:通常,按照慣例,maven將檢測main/java中的所有類文件以及test/java中的所有類文件。您不必聲明軟件包名稱。因此,如果你添加一個新的包到「主」的類,它們將被編譯和打包,如果你添加了一些新的測試到「測試」,這些將在測試階段被自動發現和執行。

+0

是的,我確定我明白這一點。不過,保持「main」中相同的目錄結構與「test」中的目錄結構保持一致是合乎邏輯的。只是想知道Maven是否自動做到了這一點。因此,舉例來說,如果你在`main`中有`org.bio.something.MyApp`,你可能需要在測試目錄下的`org.bio.something.MyAppTest`下面的測試。 – 2010-11-29 09:02:21

+0

@Luca - 但這不是maven的工作。 Maven用於構建應用程序(編譯,測試,打包,部署),而不是用於創建源文件夾或組織代碼。 – 2010-11-29 13:46:02

0

通常我會在創建測試時依賴IDE來做到這一點。

如:

  • main/創建一個新類org.bio.mynewpackage.MyNewClass
  • 現在,當我創建測試org.bio.mynewpackage.MyNewClassTest時,IDE應自動創建必需的目錄樹。
+0

好的。我還不是一個很棒的IDE粉絲,我以爲Maven有這個功能。 – 2010-11-29 09:04:02

0

我不知道你是否在尋找一些特定的問題,如何maven可能會幫助你做到這一點。仍然我一直使用rsync來匹配目標文件夾。

沿東西線: rsync的-Crit ./source ./target

  1. 其中C忽略版本 文件/文件夾,如使用svn
  2. r是遞歸i是信息輸出。
  3. t是時間戳。我一直把這個 確保文件差異是 基於時間戳。

添加'n'以在測試模式下運行,它將輸出將改變而不是實際執行的操作。如果你沒有正確的做法,總是先做這件事,因爲rsync可能會把事情弄糟。

您還可以在每個目錄中的文件中或在命令行中添加一次模式匹配規則。

0

我不知道有這樣做的插件,但它應該很容易編寫一個。它甚至可以通過一些簡單的Groovy腳本使用gmaven-plugin或類似的方法來完成。

另外,這個shell命令應該做你想要什麼:

# ! -wholename '*/.*' excludes hidden dirs like .svn 
$(cd src/main/java/ && find -type d ! -wholename '*/.*' -exec mkdir -p ../../test/java/{} \;) 

編輯:

這裏有一個simple Maven plugin(這個插件排序按名稱的日食classpath文件項),應該給你一個快速開始Maven插件開發。

相關問題