为什么添加一个测试罐会炸毁这个maven构建?

时间:2009-02-12 20:58:28

标签: maven-2 build testing

好的,所以我现在得到一个对Maven 2感到恼火。我们得到的项目设置很简单:一个“核心”项目,它依赖于“批处理”和“网络”项目,以及依赖于“网络”的“耳朵”项目。非常简单的东西。

好吧,因为核心使用了很多,这是该组第一次实际进行TDD(测试驱动开发),已经创建了相当多的模拟,但主要是在Web项目中 - 批处理项目是现在很简单。

此当前(受阻)XML包含在Web pom中,以将核心项目作为依赖项包含在内:

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>XYZ-core</artifactId>
<version>${project.version}</version>
</dependency>

如果包含 ,那么pom就可以工作,以及包含的其余jar文件。其中一个jar文件是servlet api,2.4是版本:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${version.servlet-api}</version>
<scope>provided</scope>
</dependency>

这是设置为提供的范围,因为它将由Web容器提供。没有惊喜。只有在网络pom中,它运行测试并安装没有问题。

但是,现在网上有所有这些模拟。批处理也可以使用其中一些模拟。因此,我自然希望将核心测试作为范围测试放在批处理和Web中,因此我可以将模拟(模拟核心功能)移动到核心测试中,以便它们可以在项目之间共享。以下代码段(屏蔽)在批处理项目中起作用:

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>XYZ-core</artifactId>
<classifier>tests</classifier>
<version>${project.version}</version>
<scope>test</scope>
</dependency>

然而,当我将它添加到网络pom时,当我尝试构建网络时,我得到了这个。

XYZ.java:[33,16]无法解析符号符号:class HttpServletRequest

如果删除它,则会成功构建Web。

有什么想法吗? maven版本是2.0.4。我可以尝试升级,但这会带来很多麻烦。

编辑:Web的主要类无法使用该错误进行编译(也未找到HttpServletResponse)。即使跳过测试(-Dmaven.test.skip = true),也会发生此错误。

3 个答案:

答案 0 :(得分:2)

Maven 2.0.4已经三年了,并且在Maven 2与插件版本交互的方式之前发生了相当关键的变化。在Maven 2.0.9之前,Maven版本将下载所需的所有插件的最新版本。您可能会遇到不一致,因为您使用的是Maven 2.0.4的新插件。在做任何事情之前,尽管麻烦,还要更新到Maven 2.0.9以上的任何内容。我很惊讶你仍然可以用2.0.4构建。

目前,您应该考虑更新为2.0.10或2.1.0。主要区别在于2.1.0包含一些并行下载改进和支持加密服务器密码。

答案 1 :(得分:1)

你应该检查mvn help:effective-pom,包括有没有违规的块。

你可能也会被this bug咬伤,但你必须看看它是否适用于你的父母情况。

在任何情况下,你真的应该至少在maven 2.0.9的临时区域中尝试它...你可以编辑maven启动脚本,这样它就不会影响你现有的存储库等等。只有这样才能知道肯定你没有受到已经解决过的bug的攻击。<​​/ p>

答案 2 :(得分:0)

这对你的maven发行本身来说不是问题。

通常,在尝试解决为什么某些依赖项未包含在其预期的工件或范围中时,请使用mvn dependency:tree

在您的情况下,尽管您将servlet-api工件作为提供的依赖项提供,但实际上您需要在测试阶段提供可用的实现。听起来像你在批处理中运行的测试从不导入从javax.servlet导入任何内容的模拟类,但是你在web中的测试会导入从javax.servlet导入内容的模拟 - 如果我错了那么请纠正我,当然

我会考虑添加一些jetty实现作为测试范围的依赖项,看看是否能让你更进一步。