【问题标题】:Maven - synch "main" folder with "tests" folderMaven - 将“主”文件夹与“测试”文件夹同步
【发布时间】:2010-11-29 08:53:09
【问题描述】:

我刚刚开始在我的项目中使用 Maven。我所有的生产代码当然都在 ma​​in 目录中。当我将单元测试添加到我的 tests 目录时,有没有办法将main 目录与我的tests 目录同步?

例如,假设我添加了一个新包org.bio.mynewpackage。我必须进入我的 ma​​in 文件夹并添加相同的包名...这很烦人。

有什么想法吗?

【问题讨论】:

  • 您使用的是什么 IDE?这听起来像是它可以为你做的事情。 (Maven 不在乎;它的工作特别是生成target 目录的内容,以便您可以专注于源代码……)

标签: java unit-testing junit maven


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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,我明白这一点。然而,在“main”中保持与“test”中相同的目录结构听起来合乎逻辑。只是想知道Maven是否自动执行此操作。因此,例如,如果您在 main 中有 org.bio.something.MyApp,您可能希望它的测试位于测试目录中的 org.bio.something.MyAppTest 下。
    • @Luca - 但这不是 maven 的工作。 Maven 用于构建您的应用程序(编译、测试、打包、部署),而不是用于创建源文件夹或组织代码。
    【解决方案3】:

    通常我会在创建测试时依赖 IDE 来执行此操作。

    例如:

    • 我在main/ 中创建了一个新类org.bio.mynewpackage.MyNewClass
    • 现在当我创建一个测试org.bio.mynewpackage.MyNewClassTest 时,IDE 应该会自动创建必要的目录树。

    【讨论】:

    • 好的。我还不是 IDE 的忠实粉丝,我认为 Maven 有这方面的东西。
    • Maven 有很多用途,但替代 IDE 不是其中之一。
    • @S.P.Floyd - 当然不是,我从来没有这么说过。但是考虑到 Maven 带来了目录结构作为它的主要特性,我认为会内置这样的东西。
    • @Luca 我相信你可以编写一个插件来复制 test/ 和 main/ 中的目录结构,但有什么意义呢?此外,您的测试是否总是必须与源代码具有相同的包结构?
    • @Here Be Wolves - 拥有相同的包结构只是一种额外的标准做法,似乎合乎逻辑。如果其他人正在查看我的代码,他们确切知道在哪里可以找到特定包类的测试。
    【解决方案4】:

    我不知道您是否正在寻找有关 maven 如何帮助您做到这一点的具体内容。仍然我一直使用 rsync 来匹配目标文件夹。

    大致如下: rsync -Crit ./source ./target

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

    添加 'n' 以在测试模式下运行,它会输出将要更改的内容,而不是实际执行。始终首先执行此操作,因为如果您没有正确设置,rsync 可能会完全搞砸。

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

    【讨论】:

    • 我认为他只是在寻找一种同步目录的方法,而不是文件。
    • rsync 也会这样做。鉴于我没有广泛使用 maven,我可能几乎跑题了。
    【解决方案5】:

    我不知道有什么插件可以做到这一点,但编写一个应该很容易。甚至可以使用 gmaven-plugin 等通过一些简单的 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 插件开发。

    【讨论】:

      猜你喜欢
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2016-01-08
      • 1970-01-01
      相关资源
      最近更新 更多