【问题标题】:Maven Shared DependencyMaven 共享依赖
【发布时间】:2012-01-21 16:19:01
【问题描述】:

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

|-mainProject
|-webProject

其中 mainProject 将 webProject 作为依赖项(战争包装)。 由于webProject也依赖于mainProject,因此出现错误,因此我更改了结构

|-coreProject
|-mainProject
|-webProject

这样核心就被打包到一个 jar 中,并且 main 和 web 都具有核心作为依赖项。 现在我在创建 -shade.jar 时看到了不同的错误。

CoreProject 的组件需要被 main 和 web 项目使用。 在这种情况下,最佳做法是什么?


我的依赖图看起来像

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

我在 mainProject 中使用嵌入式码头,因此我的最终结果将是来自 mainProject 的单个 jar 文件,其中包括 web&coreProjects。

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

我尝试过诸如

之类的过滤器
<filters>
   <filter>
      <artifact>*:*</artifact>
      <excludes>
         <exclude>META-INF/*.SF</exclude>
         <exclude>META-INF/*.DSA</exclude>
         <exclude>META-INF/*.RSA</exclude>
      </excludes>
   </filter>
</filters>

但还是出现同样的错误

【问题讨论】:

  • 您遇到了什么错误?它与您所说的循环依赖有关吗?你在创建多模块项目吗?

标签: java maven-2 build pom.xml


【解决方案1】:

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

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

【讨论】:

  • “高度”异常?除了企业发展之外。
  • 如果你所有的战争都相互依赖,你就没有多重依赖;您有一个项目被错误地拆分为子项目。
  • @DaveNewton - 好吧,那是真的。您将 WAR 包含到 EAR 项目中。我会修改我的答案。
  • @StefanKendall 我不认为战争相互依赖,我也没有说他们会。但是战争包含项目的依赖项。
【解决方案2】:

CoreProject 的组件需要被 main 和 web 项目使用。在这种情况下,最佳做法是什么?

如果 CoreProject 包含 Java 类但不包含 Web 内容,则将其设为 JAR 项目。

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

在 Maven 中循环依赖肯定是有问题的。您要么需要打破循环(通过重组事物),要么将其全部整合到一个 Maven 工件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2011-10-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多