【问题标题】:How to package test classes into the jar without running them?如何在不运行测试类的情况下将它们打包到 jar 中?
【发布时间】:2013-04-28 20:03:22
【问题描述】:

我正在努力将我的测试类包含到 jar 包中,但没有运行它们。经过一番谷歌搜索,我尝试了mvn package -DskipTests,但我的测试类根本没有添加到 jar 中。

有什么想法吗?

【问题讨论】:

  • 为什么在 Jar 中需要它们?
  • 它旨在成为一个 jar 中的测试套件。
  • 但是为什么呢?它应该包含在其他地方吗?它是某种测试“库”吗?
  • @NilsH 不,它不应该被重复使用,而是一个紧凑的解决方案,可以轻松运输(因此我需要一个可以使用命令行在任何地方迅速执行的单个 jar)。有这么奇怪吗?我的意思是,它来得太容易了:创建一个测试套件,把它放在一个罐子里,四处移动,按需执行......
  • 是的,这是一个非常不寻常的要求。通常,如果您需要分发测试,您可以从版本控制中签出源代码并运行测试。或者分发一个包含所有内容的 src jar。

标签: java unit-testing jar maven-2


【解决方案1】:

如果您遵循 maven 约定,那么您的测试类在 src/test/java 下。 maven 从不将测试源子目录的内容打包到工件中。

你有(至少......)3个替代品:

使用“正常”来源进行测试

如果您真的希望将它们打包(为什么?),那么您应该将测试类放在src/main/java 下,它们将被视为正常源,并将它们的编译类打包到工件中(通常 * .jar)

您这样做会遇到各种各样的问题。例如,您的工件将对 junit 具有编译范围的依赖关系,这可能会干扰使用您的 jar 的其他模块。

此外,如果您这样做(也就是说,如果您确实希望将测试作为构建的一部分运行),您可能必须配置运行测试的 maven 插件以了解您的测试类。例如surefire和failsafe插件。

配置 maven jar 插件以构建测试 jar

请参阅maven jar plugin documentation。他们甚至有一个标题为“如何创建包含测试类的 jar”的部分 - 那里的说明会将您的测试打包到一个单独的 jar 文件中(这可能是一个更好的主意)。

直接使用程序集插件创建 jar

你可以disable the default execution of the jar plugin 而是将assembly plugin 的执行添加到包阶段以创建一个jar。你需要为此写一个assembly descriptor(不像上面的链接那么复杂)。这将使 yu 完全控制所生产的 jar 中包含的内容。最好从复制predefined assemblies 之一开始

【讨论】:

  • 你可以创建一个只包含测试类的附加工件,但这仍然是一个奇怪的要求......
  • @NilsH - 我同意这个要求很奇怪,但如果他确定这就是他想要的......
  • @radai 您对存档插件的最后一次编辑似乎很有趣,但它完全缺乏将已编译的测试用例放入同一个 jar 的信息。你能详细说明一下吗?
  • @dcsordas - 它比我记得的要复杂一些 - 你不能用存档配置来做到这一点,但你 可以 用装配插件来做到这一点(这是jar 插件无论如何)。我已经更新了我的答案。
  • 最终我选择了 jar + test-jar 组合(暂时 :P )。感谢@radai 和@NilsH 的所有输入!
【解决方案2】:

如果是对当前项目的测试,那么它应该在src/test/java中,并且不会包含在主jar中。这是最常见的用例。如果您正在编写一个将在其他项目中使用的测试库,请将它们放在 src/main/java 中,并将其添加为这些项目中具有 test 范围的依赖项。

如果您想在“自包含包”中分发所有内容,您可以通过版本控制存储库共享代码,或者使用 maven 程序集插件创建源 jar。

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多