2010-11-29 81 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插件开发。