如何在Maven/Surefire unittest运行"mvn test"期间使清单可用?

Ern*_*aan 9 maven-2 manifest.mf junit4 surefire

如何在Maven/Surefire unittest运行"mvn test"期间使清单可用?

我有一个开源项目,我正在从Ant转换为Maven,包括它的单元测试.这是Maven项目的项目源存储库:http: //github.com/znerd/logdoc

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

Library.class.getPackage().getImplementationVersion()
Run Code Online (Sandbox Code Playgroud)

getImplementationVersion()方法返回清单文件中的设置值.到现在为止还挺好.我在过去测试了这个并且它运行良好,只要清单确实可以在路径的类路径上META-INF/MANIFEST.MF(在文件系统上或在JAR文件内).

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

mvn test
Run Code Online (Sandbox Code Playgroud)

Surefire运行单元测试,但我的单元测试失败,并显示Library.getVersion()返回的消息null.

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

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

/private/var/folders/TR/TREvj1wIHYyAcUy-xmc3UU+++TI/-Tmp-/surefirebooter7448562488934426857.jar
Run Code Online (Sandbox Code Playgroud)

然后使用此JAR加载Library类.这个JAR不包含我所困的资源src/main/resources.所以放一个META-INF/MANIFEST.MF文件也行不通.

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

请注意,我在Mac OS X 10.6.2上使用Maven 2.2.0,Java 1.6.0_17,使用JUnit 4.8.1.

Pas*_*ent 2

好吧,正如您所指出的,问题是 是在最终 jarMANIFEST.MF期间生成package并直接包含在最终 jar 中,而所有这一切都发生在test. 所以我想你必须:

  • 提供您自己的 MANIFEST.MFtarget/classes (在合并之前可用package)。我不知道这是否是一个选项(以及是否有效)。
  • 根据 JAR 从另一个模块放置并运行测试。