【问题标题】:How to properly setup Maven with tests being a separate module如何正确设置 Maven,测试是一个单独的模块
【发布时间】:2022-01-06 11:51:10
【问题描述】:

我的文件夹结构

|   pom.xml
|
+---.idea
|       .gitignore
|       compiler.xml
|       jarRepositories.xml
|       misc.xml
|       vcs.xml
|       workspace.xml
|
+---mysource
|       Main.java
|       pom.xml
|
\---tests
        MyTestClass.java
        pom.xml

pom.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>my-project</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mysource</module>
        <module>tests</module>
    </modules>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
</project>

mysource/pom.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.example</groupId>
        <artifactId>my-project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>my-project-mysource</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.34</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.34</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

tests/pom.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.example</groupId>
        <artifactId>my-project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>my-project-tests</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.8.2</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

IntelliJ 为所有 java 文件显示“源根目录之外的 Java 文件”。我认为一个或多个 pom.xml 文件有问题。

注意:我想保持文件夹结构不变。

【问题讨论】:

  • 单元测试属于您的生产代码所在的同一个模块...除了您想编写特殊的集成测试或者可能在 java 模块级别上进行测试...
  • 另外我强烈建议在你的根 pom 中使用 dependencyManagement 而不是重复所有内容...
  • @khmarbaise 我可以在保持文件夹结构的同时这样做吗?
  • 根据大纲结构,您的整个设置是错误的。源码属于src/main/java/&lt;packageName&gt;/,单元测试属于src/test/java/&lt;packageName&gt;/XYZTest.java等。源代码不属于根目录。问题是为什么?你想改变约定的目的是什么? IDEA 也告诉过你要改变它……为什么?
  • @khmarbaise 不管是什么原因,应该有办法做到这一点。 Per docs,“有一个普遍的误解,即 Maven 无法构建不符合某些目录结构或构建实践的项目。通常情况并非如此。但是,某些 Maven 功能或插件(尤其是第三方插件)可能无法运行或无法完全运行。” ---- 所以应该有办法,我就是想知道:)

标签: java maven intellij-idea intellij-15


【解决方案1】:

默认情况下,pom.xml 期望您使用以下结构:

|   pom.xml
+---.idea
|       ...
\---src
  +---main
  | \---java
  |     Main.java
  \---test
    \---java
        MyTestClass.java
        

现在,您可能确实希望将其拆分为 2 个模块(例如,将您的 JMH 测试隔离在一个单独的模块中):

|   pom.xml // has <modules> entry
+---.idea
|       ...
+---my-main
| +---pom.xml
| \---src
|   \---main
|     \---java
|       Main.java
\---my-jmh-tests
  +---pom.xml
  \---src
    \---test
      \---java
        MyTestClass.java

您可以通过自定义 pom.xml 文件中的 &lt;build&gt; 部分来摆脱“src/main/java”和“src/test/java”文件夹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2020-11-01
    • 2015-05-20
    • 2019-01-28
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多