代码之家  ›  专栏  ›  技术社区  ›  Luca Matteis

Maven-将“main”文件夹与“tests”文件夹同步

  •  2
  • Luca Matteis  · 技术社区  · 14 年前

    我刚开始在我的项目中使用Maven。当然,我所有的生产代码都在 主要的 目录。当我将单元测试添加到 测验 目录,是否有方法同步 main 直接与我的 tests 迪尔?

    例如,假设我添加了一个新包 org.bio.mynewpackage . 我得进去 主要的 文件夹并添加相同的包名。。。这太烦人了。

    有什么想法吗?

    5 回复  |  直到 14 年前
        1
  •  1
  •   Sean Patrick Floyd    14 年前

    下面是嵌入在 GMaven plugin 执行。它完全符合你的要求。

    <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允许您定义保存文件时它自动运行的生命周期阶段,这样会更容易。

        2
  •  0
  •   Andreas Dolk    14 年前

    我不知道我是否解决了您的问题:通常,按照惯例,maven将检测main/java中的所有类文件和test/java中的所有类文件。您不必声明包名称。

    因此,如果您向“main”添加新包类,则它们将被编译和打包;如果您向“test”添加一些新测试,则将在测试阶段自动发现并执行。

        3
  •  0
  •   jrharshath    14 年前

    通常,在创建测试时,我会依赖IDE来完成这项工作。

    如:

    • 我创建了一个新类 org.bio.mynewpackage.MyNewClass 在里面 main/ .
    • 现在当我创建一个测试 org.bio.mynewpackage.MyNewClassTest ,IDE应自动创建必要的目录树。
        4
  •  0
  •   Emile    14 年前

    我不知道你是不是在找一些关于maven如何帮助你的具体问题不过,我一直使用rsync来匹配目标文件夹。

    大致如下: rsync-标准/源/目标

    1. 其中C忽略版本控制 文件/文件夹,如.svn
    2. r是递归i是信息输出。
    3. t是时间戳。我总是把这个 确保文件中的差异 基于时间戳。

    添加'n'以在测试模式下运行,它将输出将要更改的内容,而不是实际执行。总是先这么做,因为如果你不正确的话rsync会把事情搞得一团糟。

    还可以在每个目录的文件中或在命令行中添加模式匹配规则。

        5
  •  0
  •   sfussenegger    14 年前

    我不知道有什么插件能做到这一点,但是写一个插件应该很容易。它甚至可以通过使用gmaven插件或类似的简单Groovy脚本来完成。

    或者,这个shell命令应该执行您想要的操作:

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

    编辑:

    这是一个 simple Maven plugin (这个插件按名称对eclipse.classpath文件的条目进行排序)这将让您快速开始Maven插件开发。