【问题标题】:Import of test package not possible无法导入测试包
【发布时间】:2021-07-26 08:53:42
【问题描述】:

我试图将io.quarkus.test.* 包导入到项目的src/main 目录中的类中。但是 IDE 总是抱怨找不到这个包,即使它确实存在(Ctrl+单击)。 maven 还告诉“找不到符号”。

但是当我将此 java 文件移动到 src/test 目录时,IDE 能够找到它并且可以解析导入。

这种行为是如何产生的?谁能给我解释一下?

【问题讨论】:

    标签: java testing directory package quarkus


    【解决方案1】:

    要编译任何给定的源文件,javac 首先需要有关您在其中引用的所有各种类型的信息。即使 java.lang.String 对 java 编译器没有任何意义,除非它可以找到资源 java/lang/String.class,或者如果它有一个可以首先编译的 java 源文件,那么它就有一个 String.class 文件。

    幸运的是,几乎所有 java 都有“引导类路径”(或者在更现代的版本中,引导模块),这就是 java.lang.String 所在的位置。 Java 知道这个引导位置在哪里,并始终自动包含该批次。

    但其余部分,例如 io.quarkus.test.stuff,必须在编译器运行时位于类路径或源路径中。

    src/main 源目录是用类路径和源路径上的各种东西编译的。

    您的src/test 目录以及所有配置为仅在测试配置中可用的依赖项不属于该路径!

    这是设计使然:您不想发布单元测试,因此无需发布例如junit.jar 以及在发布您的应用程序时运行测试所需的所有其他东西。如果您的 src/main 代码意外引用了 src/test 中的文件或任何仅测试依赖项,并且您的 IDE 只是正常连接它,那么您的机器上一切正常,您将它发送到服务器(或变成安装程序并将其发送给您的客户),然后一切都失败了。

    结论很简单:

    • 如果您希望从主源代码树访问工具以访问当前仅配置为“测试”部署的东西,那么这不再是测试部署,并且需要移动它。请注意,src/test 目录通常可以访问所有主要需要的东西,除非您不遗余力地以一种非常奇怪的方式配置您的构建。因此,这一举措不会导致您的测试代码出现问题。
    • 如果您在 src/main 中有一些代码只是您真正需要用于测试,那么它应该在 src/test 中。

    【讨论】:

    • 这是一个很好的答案,但我建议修改以粗体突出显示的句子。 src/test 中的东西 与类路径和源路径上的各种东西一起编译 -- 问题是类路径和源路径与 src/main 的情况不同。跨度>
    • 嘿,我的意思是,src/test 在编译 src/main 时不在路径上。我会试着想一些不那么令人困惑的事情。
    • 似乎每个框架提供者都可以分类他们的包的哪些部分应该包含在这个源路径中。但是这种区别发生在哪里呢?编译器如何知道哪个包被认为是“主”包,哪个不是?
    • @user3192295 编译器只是按照它的指示进行操作,具体来说,它会查看-classpath-sourcepath-Xbootclasspath 参数(最后一个是自动正确设置的,不要'不要弄乱它),并且您提供给它的所有源文件本质上也是它的一部分。就这么简单。那么[插入您在此处使用的工具] 是如何做到的呢?询问工具/阅读文档。示例工具:maven、gradle、eclipse、intellij 等
    • 很可能(尽管我没有检查)Quarkus 测试框架由 Quarkus BOM 管理为<scope>test</scope>。如果是这种情况(同样,我认为这很有可能,但没有真正检查:-)),那么取决于 Quarkus 测试框架会自动将它放在 test 编译类路径中,而不是放在main 编译类路径。您可以手动覆盖<scope>,但我认为在 99% 的情况下这是一个坏主意。
    猜你喜欢
    • 2021-03-03
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多