1

所以不久前我开始使用 maven(使用 eclipse 和 Sonatype 的本地实现),在经历了最初的痛苦之后,我虽然一切正常......显然不是!

我有我的主项目 POM 和我所有的子 POM(我使用的是“平面”层次结构,所以所有子项目都与父 POM 在同一个文件夹中)。这似乎工作正常。

在我开始使用 Maven 之前,所有启动和“发布”和测试的子项目。我去 maven 解决我的“依赖”问题......或者在这种情况下让它们变得更复杂。

大多数“Maven”的东西似乎都可以正常工作,但是我无法解决已发布到本地 ms/repository 中的“子项目”的依赖关系

每天我启动 eclipse 并遇到同样的问题,我的所有个人库以及我用于它们的所有库(例如 Log4j、DDlUtils 等)都“无法解析导入”。

我认为 maven 的全部意义在于我可以为库添加导入声明,将“groupID”和其他内容添加到子 POM(或父 POM)中。然后在我对父级运行 mvn install 时自动下载所有 jar。

但是,每天我发现我必须通过 eclipse 工作区重新插入库(内部和外部)的构建路径,并将它们指向我下载的库的位置,因为 maven 似乎无法在任何地方找到它们。

特别是通过运行 Junit 测试,我可以从工作区运行它们(使用 run as junit)并且它们都通过了。但是,如果我尝试使用 mvn test 运行它们,我会收到一条消息说 java.lang;NoClassDefFoundError: org/junit/Assert (这与在运行 mvn 测试的 eclipse 中或从 CLI 中相同)在输出中出现错误消息未能执行目标 org.apache.maven.plugins:maven.surfire-plugin:2.10:test POM 和 jar 在我的 M2_REPO 中,我在 sonatype 中搜索时可以找到它,为什么 maven 找不到是它自己系统的一部分,存在于它的 repo 中。

但是当我通过 eclipse 运行并将它指向一个独立下载的junit库时,这显然工作得很好。

我不知道您可能需要什么额外信息,而且我显然在 m2e 插件、我的 maven 安装或 sonatype 中遗漏了一些东西。

请帮助我开始松开我的头发!并且可能很快就会被迫回到蚂蚁/常春藤解决方案(但不想学习“另一种工具”(在这种情况下是常春藤)。

提前致谢

大卫。

附言。我在 Windows XP 平台上

编辑...我可以让 maven 构建和发布 jar 和 pom,即使它认为它没有通过测试(这不是我手动做的,它们通过就好了)。

如果我查看父 POM 的“有效 POM”选项卡,上面所述的插件不在那里。我想这意味着它是一个 Maven 配置设置,但是我在哪里添加它,为什么当我运行我的第一组 Maven 测试时它不是自动的?

编辑 2....

我刚刚在 apache 插件评论页面 (http://maven.apache.org/plugins/maven-surefire-plugin/plugin-info.html) 上找到了这个,所以我在 CLI 上运行了代码 mvn surefire:help - Ddetail=true -Dgoal=test 下载了很多东西,现在测试运行了,但是在 maven 中失败了?(请记住,当使用 'run as junit test 从 eclipse 运行时它们会通过)......所以这几乎是一个解决方案......

4

2 回答 2

1

听起来你需要让 eclipse 知道有问题的项目是 Maven 项目。您可能已经为您的项目设置了 POM,但要使 m2e 插件正常工作,您需要将项目创建为 Maven 项目('New' -> 'Project...' -> 'Maven' -> 'Maven项目...'),或通过右键单击它然后选择“配置”->“转换为 Maven 项目”将其转换为 Maven 项目。您将知道一个项目已被识别为 Maven 项目,因为它的图标左上角会有一个蓝色的小“M”,如下图所示:

一些 Maven eclipse 项目

上图中要注意的主要是“Maven Dependencies”库。这是由 m2e 插件自动设置的。每当您向 POM 添加依赖项时,项目的构建路径将自动配置,尽管有时您可能需要通过右键单击项目并选择“Maven”->“更新 Maven 配置”来强制它这样做。重要的是,如果一切正常,那么您永远不必自己更新构建路径。此外,如果您自己更新它,那么您所做的任何更改都可能会在您下次运行“更新 Maven 配置”命令时被覆盖。

从图片中还值得注意的是,“mavenProjectTest”和“primes”这两个依赖项旁边都有文件夹图标。这意味着它们已被选为工作区项目。为此,项目必须启用“工作区解析”,并且要提取的项目也需要配置为 m2e Maven 项目。

您提到下载外部库。您不需要自己下载任何库 - 通过为外部库添加正确的依赖声明,然后 Maven 将从您配置的远程存储库中下载它(无论如何都是第一次 - 之后它将能够从您的本地存储库中获取它)。默认情况下,这是Maven 中央存储库。要将外部库添加到您的项目,只需点击该链接,在搜索框中输入库,单击您需要的版本的版本链接,然后您将被带到一个页面,其中将包含您的依赖项 XML 声明可以复制并粘贴到您的 POM 中。

另一件可能有帮助的事情是,您应该确保您的源文件夹遵循 Maven 默认目录结构。也就是说,您的测试包应该包含在一个名为“src/test/java”的源文件夹中,主项目包应该放在“src/main/java”中。否则 Maven 将不知道在哪里可以找到您的源代码。可以配置 POM 来告诉 Maven 期望您的源代码位于不同的源文件夹中,但强烈建议您遵循标准的 Maven 目录结构。

因为你有子模块,我的建议是通过从头开始创建一个新的 Maven 项目来简化事情,你可以玩一下。一旦您对此感到满意,然后尝试让 m2e 为您的多模块项目工作。

我记得你第一次接触 Maven 时的痛苦,但一旦你了解它在做什么并且一切正常,那就太好了。我强烈推荐阅读免费的在线书籍Maven: The Complete Reference - 它在我开始使用 Maven 时帮助了我很多。

于 2012-06-06T00:02:06.540 回答
0

感谢我组织的一位 Maven 专家,我遇到了同样的消息并找到了可行的解决方案。

这是我的 pom.xml,它重现了您的错误:

  <dependencies>
    <dependency>
        <groupId>org.junit4</groupId>
        <artifactId>org.junit4</artifactId>
        <version>4.3.1</version>
    </dependency>
  </dependencies>

有了它,我会收到package org.junit does not exist消息和NoClassDefFoundError: org/junit/Assert. 与您的经验类似,它在 Eclipse、绿色条和所有方面都表现出色。

这是有效的 pom.xml

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

我从这个 Using JUnit 页面顶部的示例中复制了这个。

于 2012-08-21T15:54:32.690 回答