Maven共享依赖

时间:2011-12-16 02:18:47

标签: java maven-2 build pom.xml

刚进入Maven,我遇到了循环依赖问题。 我原来的结构是

|-mainProject
|-webProject

其中mainProject将webProject作为依赖项(war包装)。 因为webProject也依赖于mainProject而出现错误,所以我改变了结构

|-coreProject
|-mainProject
|-webProject

以便核心被打包到一个jar中,主要和web都有核心作为依赖。 现在我在创建-shade.jar时看到了不同的错误。

CoreProject的组件需要主要和Web项目一起使用。 在这种情况下,最佳做法是什么?


我的依赖图看起来像

mainProject(jar) -> webProject(war)   --
                |-> coreProject(jar) <-|
                |-> jetty jars

我在mainProject中使用了嵌入式jetty,因此我的最终结果将是来自mainProject的单个jar文件,其中包含web和coreProjects。

[错误]无法在项目mainProject上执行目标org.apache.maven.plugins:maven-shade-plugin:1.4:shade(默认):创建阴影jar时出错:Manifest主要属性的签名文件摘要无效 - &GT; [帮助1]

我尝试了过滤器,例如

<filters>
   <filter>
      <artifact>*:*</artifact>
      <excludes>
         <exclude>META-INF/*.SF</exclude>
         <exclude>META-INF/*.DSA</exclude>
         <exclude>META-INF/*.RSA</exclude>
      </excludes>
   </filter>
</filters>

但仍然得到相同的错误

2 个答案:

答案 0 :(得分:1)

以你所描述的方式将WAR项目作为另一个项目的依赖项是非常不寻常的。我能想到的有效场景是将WAR捆绑到“更高”级别的存档(如EAR)。但在这种情况下,您的依赖关系是在您的EAR项目中定义的,而不是相反。无论如何,如果您想要遵循最佳实践,请将核心类放在mainProject中,并将其包装设置为JAR。然后为您的webProject添加依赖项。

如果mainProjectwebProject始终一起部署,您应该考虑将它们定义为multimodule POM中的子模块。

答案 1 :(得分:0)

  

CoreProject的组件需要主要和Web项目一起使用。在这种情况下,最佳做法是什么?

如果CoreProject包含Java类但没有Web内容,请将其作为JAR项目。

如果CoreProject中还包含Web内容(即,属于WAR而不是JAR),那么您可以将其作为WAR项目,并使另外两个WAR项目使用WAR文件覆盖来合并它。您可以阅读有关此here的更多信息。

在Maven中,循环依赖性肯定存在问题。你要么需要打破循环(通过重新组织事物),要么把它全部拉成一个Maven工件。