【问题标题】:Classes in test package not available at compile time in IntelliJ测试包中的类在 IntelliJ 编译时不可用
【发布时间】:2018-07-26 06:55:25
【问题描述】:

我有如下设置:

我有两个模块:moduleamoduleb,在这种情况下,moduleb 依赖于 modulea 定义为:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>module-a</artifactId>
    <version>1.0-SNAPSHOT</version>
    <type>test-jar</type>
</dependency>  

这允许我在开发时在ClassInSourceB 中使用ClassInTestA 而不会出现任何问题:

但是,当我尝试构建项目时,此错误会阻止 IntelliJ 完成构建:

我在 SO 中遇到过类似的问题:

但是,建议的解决方案都无法帮助我解决问题。我创建了一个可用的 MVCE,here as zipin GitHub

我正在工作的真实世界项目是neo4j,它遵循这种结构。此外,使用mvn install/package 编译没有任何问题,在 IntelliJ 中工作时会出现问题。

【问题讨论】:

  • ClassInTestAClassInSourceB的用意是什么?为什么ClassInSourceB 需要从ClassInTestA 扩展?
  • 这只是Java主要项目neo4j所遵循的结构的简化。在实际代码中,有几个类似的类,用于不同的目的。

标签: java maven testing intellij-idea


【解决方案1】:

一般来说,通过在 IntelliJ 外部使用 mvn clean package 构建新项目,然后仅通过“打开”父模块将其导入来“打开”一个新项目是有意义的。这对我有用:

甚至在重建之后:

如果您不想通过删除所有 IDEA 文件夹和文件来重新导入项目并使用上述方式,您可以尝试通过 Maven 工具栏构建项目(在父模块上清理并打包),然后使用“重新导入所有 Maven 项目”按钮:

至少有时这对我有用,但老实说并非总是如此。

【讨论】:

  • 首先在外部构建它是指做mvn installmvn package?
  • 是的,完全正确。附带说明:我几乎从不使用mvn install,而更喜欢mvn package。如果我不需要,为什么用“正在进行的工作”快照“污染”我的本地存储库? :-)
  • 完美,我会在我的玩具项目和 neo4j 中尝试一下(在我的机器上执行 mvn package/install 需要将近 14 分钟!)我会告诉你进展如何。谢谢。
【解决方案2】:

测试类未打包在最终工件中。要共享测试类,您必须在 modulea 中使用 jar maven-jar-plugin

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <executions>
            <execution>
                <goals>
                    <goal>test-jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

并在modulebpom.xml中添加一个依赖:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>module-a</artifactId>
    <version>1.0-SNAPSHOT</version>
    <classifier>tests</classifier>
</dependency> 

【讨论】:

  • 第二个代码块似乎适用于我的玩具项目,我之前测试过添加 classifiertype 标签,现在只使用 classifier 项目编译。我会尝试更大、更复杂的项目,我会尽快回复你。谢谢。
【解决方案3】:

编译阶段不包含测试源

Apache Maven Compiler Plugin

compiler:compile绑定到compile阶段,用于编译 主要源文件。

我认为主要来源不应该依赖于测试来源。测试源仅用于测试主要源。你可以把ClassInTestA放在module-a/src/main/java下面。

【讨论】:

  • 是的,我已经阅读了几个与您相同的 cmets:“主要来源不应依赖于测试来源”,但是,我正在从事的项目具有相同的结构(显然它所有其他开发人员都以这种方式工作),我发现很难更改整个代码库。
猜你喜欢
  • 2016-04-19
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多