Maven 2 如何在Maven/Surefire单元测试运行期间使清单可用;mvn测试;?

Maven 2 如何在Maven/Surefire单元测试运行期间使清单可用;mvn测试;?,maven-2,junit4,surefire,manifest.mf,Maven 2,Junit4,Surefire,Manifest.mf,如何在Maven/Surefire单元测试运行“mvn测试”期间使清单可用 我有一个开源项目,我正在从Ant转换到Maven,包括它的单元测试。以下是Maven项目的项目源存储库: 我的问题与主要模块有关,称为“基础”。此模块有一个单元测试,用于测试类org.znerd.logdoc.Library中静态方法getVersion()的行为。此方法返回: Library.class.getPackage().getImplementationVersion() getImplementatio

如何在Maven/Surefire单元测试运行“mvn测试”期间使清单可用

我有一个开源项目,我正在从Ant转换到Maven,包括它的单元测试。以下是Maven项目的项目源存储库:

我的问题与主要模块有关,称为“基础”。此模块有一个单元测试,用于测试类
org.znerd.logdoc.Library
中静态方法
getVersion()
的行为。此方法返回:

Library.class.getPackage().getImplementationVersion()
getImplementationVersion()
方法返回清单文件中设置的值。到目前为止,一切顺利。我在过去测试过它,只要清单确实在类路径上的路径
META-INF/manifest.MF
(在文件系统上或在JAR文件中)可用,它就工作得很好

现在我的挑战是,在运行单元测试时,清单文件不可用:

mvn test
Surefire运行单元测试,但我的单元测试失败,有一个消息表明
Library.getVersion()
返回了
null

当我想检查JAR时,我发现它甚至还没有生成。在将资源添加到类路径之前,Maven/Surefire对类运行单元测试

进一步的调查显示,Surefire在一个临时目录中生成自己的JAR文件,例如

/private/var/folders/TR/TREvj1wIHYyAcUy-xmc3UU+++TI/-Tmp-/surefirebooter7448562488934426857.jar
然后使用这个JAR加载库类。这个JAR不包含我卡在
src/main/resources
下的资源。因此,放置
META-INF/MANIFEST.MF
文件也不起作用

那么,我如何告诉Surefire让我的
META-INF/MANIFEST.MF
文件可以从与
类相同的类加载器中获得呢

注意,我在MacOSX10.6.2和JUnit4.8.1上使用Maven 2.2.0、Java1.6.017


正如您所指出的,问题在于
MANIFEST.MF
是在
期间生成的,并直接包含在最终的jar中,所有这些都发生在
测试之后。所以我想你必须:

  • 提供(在
    程序包
    期间合并之前,可在
    目标/类
    中找到)。我不知道这是否是一种选择(以及是否可行)
  • 根据JAR,从另一个模块放置并运行测试
Pascal,非常感谢您的回答。我尝试了这两种方法:当我添加一个文件
src/main/resources/META-INF/MANIFEST.MF
并运行
mvn clean test
时,该文件确实会被复制到
target/classes/META-INF/MANIFEST.MF
,但单元测试显然仍然无法访问它。当我依赖于同一项目中另一个模块的JAR时,就不会使用JAR,而是使用生成的类目录。我为此创建了报告SUREFIRE-620。@Ernst好吧,我没有帮忙,但不客气:)我对第一个解决方案有很大的怀疑,但看起来我对第二个解决方案太自信了。感谢您发布Jira问题,这是一个有趣的案例。我做了更多的调查并更新了问题。我会做更多的搜索。也许一个“在这里找到额外的类路径”的指令会起作用。帕斯卡建议的第一个解决方案在理论上会起作用。我的“src/main/resources”目录中有一些文件(包括Hibernate.hbm.xml文件),可以在Maven surefire运行中访问这些文件。幕后一定发生了意想不到的事情。我还查看了您的源代码和pom.xml文件,它们似乎都配置正确。但是,我注意到您明确使用的是surefire插件的2.5版,Maven Central上现在提供了2.7.1版,您是否尝试使用最新版本?还要确保您使用“classpath:/”字符串引用类路径文件,否则类可能会尝试查找与其位置相关的文件。