eclipse中的Maven动态Web项目为依赖项目部署了无效的jar文件

时间:2012-03-14 21:58:51

标签: eclipse maven m2e

我有一个导入eclipse的maven web项目。我有另一个maven项目(生成一个jar文件),web项目依赖于该项目。

从命令行执行时,这两个项目都能正常工作。 mvn包创建一个war文件,它从web项目的maven存储库中提取它依赖的jar。 mvn包在为库运行时创建一个有效的jar文件。

当我将库导入Eclipse时,m2e认识到Web项目依赖于库并更新项目的各个部分,以利用两个maven项目都托管在单个Eclipse工作区中的事实。 Web项目的“Java Build Path”首选项的“Libraries”选项卡的“Maven Dependencies”部分删除库jar文件并将其替换为库项目。随着库在Eclipse中更新,Web项目可以识别这些更改,而无需安装/部署库。

当我尝试在Eclipse中运行Web应用程序时,会出现问题。因为Eclipse实际上是针对Eclipse中的库版本构建Web项目,所以它不会从maven存储库中部署库文件,而是创建一个新的jar文件,它是Eclipse中当前版本库的快照。所有这一切对我来说一般都很好,但是在我正在研究的项目中,Eclipse正在创建的jar文件存在问题。它不是为库插入类文件,而是将其作为我的Maven项目的“src”目录并将其压缩为jar文件。 jar文件的内容类似于:

-main
  -java
    -com
      -... *.java
  -resources
    -...
-test
  -java
    -com
      -... *.java

我希望它看起来更像:

-com
  -... *.class

由于我以前成功使用过这种类型的项目,我想弄清楚是否需要配置一些东西,或者我是否遇到了一个bug。

我在Eclipse Indigo上使用m2e(1.0.200.20111228-1245)的最新更新(Build id:20120216-1857)。

2 个答案:

答案 0 :(得分:3)

在Eclipse中,我们可以禁用“工作区解析”,以便它将直接从本地maven存储库使用我们的依赖项,如下所示: -

禁用工作区分辨率

  1. 右键点击日食内的项目
  2. 从上下文菜单中选择“Maven”。
  3. 如果显示“禁用工作区分辨率”,则表示已启用。我们点击它是为了禁用它。请注意,之后它将显示“启用工作区分辨率”,这意味着我们已经禁用。
  4. 我们可能需要按以下步骤更新项目配置和其他相关依赖项: -

    更新项目配置

    1. 右键点击日食内的项目
    2. 从上下文菜单中选择“Maven”。
    3. 点击“更新项目配置...
    4. 将显示“更新Maven依赖关系”窗口。
    5. 选择所需项目,然后单击“确定”。
    6. 更新依赖关系

      1. 右键点击日食内的项目
      2. 从上下文菜单中选择“Maven”。
      3. 点击“*更新依赖关系”
      4. 将显示“更新Maven依赖关系”窗口。
      5. 选择所需项目,然后单击“确定”。
      6. 请注意,因为我们不再直接从工作区使用相关的依赖项,它将直接从我们的本地maven存储库使用。然后,应使用以下命令行将所有相关工件安装到我们的本地maven存储库。

          

        mvn install

        无论如何,可以通过使用Eclipse中的上下文菜单来完成以下步骤: -

        1. 右键点击日食内的项目
        2. 选择“ Run as ”---> “ Maven Install ”。

答案 1 :(得分:3)

这是我提出的解决方案。

在我的案例中,似乎仍然遵循图书馆项目的“部署大会”的规则。

要更改它,请转到库属性 - >部署程序集

在我的情况下,只包含来自'/ src'的映射 - > '/'。我删除了该条目并将其替换为来自'/ target / classes'的映射 - > '/'和'/ src / main / resources' - > '/'。

一旦我有了映射,当部署jar文件时,它就包含我在部署程序集中配置的内容。这样就可以继续使用Eclipse,而无需为每次更改明确重新发布库。但是,当库更新时,似乎没有为我自动重新部署到tomcat - 我仍然需要手动重启tomcat以反映库更改。

我仍然不完全清楚这个项目正在发生什么。我确实有以前的项目具有类似的结构,并且在那些项目中,部署程序集尚未更新为显式包含类文件,但仍然部署了正确的jar文件。