Java Maven-同步“;“主要”;文件夹中包含“文件”;测试“;文件夹

Java Maven-同步“;“主要”;文件夹中包含“文件”;测试“;文件夹,java,unit-testing,junit,maven,Java,Unit Testing,Junit,Maven,我刚开始在我的项目中使用Maven。当然,我所有的产品代码都在主目录中。当我将单元测试添加到我的tests目录时,是否有方法将maindir与我的testsdir同步 例如,假设我添加了一个新包org.bio.mynewpackage。我必须进入我的主文件夹并添加相同的包名。。。这很烦人 有什么想法吗?我不知道你的问题是否正确:通常,按照惯例,maven会检测main/java中的所有类文件和test/java中的所有类文件。您不必声明包名 因此,如果您向“main”添加一个新的包和类,它们将被

我刚开始在我的项目中使用Maven。当然,我所有的产品代码都在主目录中。当我将单元测试添加到我的tests目录时,是否有方法将
main
dir与我的
tests
dir同步

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


有什么想法吗?

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


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

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

例如:

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

我不知道您是否在寻找maven如何帮助您实现这一目标的具体方法。但我始终使用rsync来匹配目标文件夹

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

  • 其中C忽略版本控制 文件/文件夹,如.svn
  • r是递归,i是信息输出
  • t是时间戳。我总是把这个 以确保文件中的差异 基于时间戳
  • 添加“n”以在测试模式下运行,它将输出将要更改的内容,而不是实际执行。始终先这样做,因为如果您没有正确使用rsync,它可能会把事情搞得一团糟


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

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

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

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


    这里有一个插件(该插件按名称对eclipse.classpath文件的条目进行排序),可以让您快速开始Maven插件的开发

    下面是嵌入到执行中的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>
    
    
    org.codehaus.gmaven
    gmaven插件
    1.3
    镜像文件夹结构
    生成测试源
    执行
    
    问题是:它不会自动运行。我已经将它绑定到阶段
    生成测试源
    ,但是您可以选择任何其他阶段。但是,您必须手动执行该阶段,例如,
    mvn生成测试源


    如果您考虑使用M2Eclipse插件使用Eclipse,M2Eclipse允许您定义保存文件时自动运行的生命周期阶段,这样就更容易了。然而,在“main”中保持与在“test”中相同的目录结构听起来是合乎逻辑的。我只是想知道Maven是不是自动这么做的。因此,例如,如果主目录中有

    org.bio.something.MyApp
    ,您可能希望测试目录中的
    org.bio.something.MyAppTest
    。@Luca-但这不是maven的工作。Maven用于构建应用程序(编译、测试、打包、部署),而不是创建源文件夹或组织代码。您使用的是什么IDE?这听起来像是它能为你做的事情。(Maven不在乎;它的工作特别是生成
    target
    目录的内容,以便您可以专注于源代码…)好的。我还不是IDE的忠实粉丝,我以为Maven有这样的想法。Maven有很多目的,但用IDE替代不是其中之一。@S.P.Floyd-当然不是,我从来没有说过。但是考虑到Maven将目录结构作为其主要功能,我认为应该内置类似的功能。@Luca我相信您可以编写一个插件来复制test/和main/中的目录结构,但这有什么意义呢?此外,您的测试是否总是必须与源代码具有相同的包结构?@这里是狼群-具有相同的包结构只是一种额外的标准实践,似乎是合乎逻辑的。如果其他人正在查看我的代码,他们就知道在哪里可以找到特定包类的测试。我认为他只是在寻找一种同步目录的方法,而不是文件的方法。rsync也可以这样做。鉴于我没有广泛使用maven,我可能几乎偏离了主题。