我有一个Java Maven项目X,它取决于其他团队构建的项目Y。该团队为我们提供了y.jar的新版本。我们想动态加载y.jar。
因此,我们在项目X中提供了y.jar的路径,只要有新版本可用,项目X都会从该路径加载y.jar。我们在提供的范围内在项目X的pom中指定了项目Y的依赖关系(这样y.jar不会捆绑在x.jar中)。
但是,这不包括项目X中在项目Y中指定的依赖项。在运行时,对于Y的依赖项中包含的那些类,我们会收到NoClassDefFoundError错误。
如何将项目Y的依赖项包含在项目X中?通常,我们使用导入范围导入其他pom的依赖项。但是我已经指定了提供范围的项目Y。 (请注意,x.jar是胖子,并且包含X的pom中指定的所有依赖项。)
在这种情况下,什么是管理依赖项的最佳方法。 y.jar应该是胖子吗?
答案 0 :(得分:0)
如果将Y的范围标记为已提供,则yes Y应该在类路径上并且是一个胖子,尤其是在POM可用并且列出了其依赖项的情况下。如果仍在获取NOCLASSDEFFOUND,我将探索y.jar-我认为它的POM错误,即声明了jar中未包含的依赖项。如果Y不是一个胖子,或者它的POM有问题,那么您需要显式排除其依赖项,然后将它们添加为编译时依赖项。可能将它们阴影化。您可以在依赖项下使用排除语句。
在这里阅读有关内容 https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
个人而言,我讨厌依赖派生的依赖关系,并且通常在我的POM中明确声明它们。如果它们是由Y提供的,那么我将按提供的方式对其进行范围调整,否则将其范围视为编译并确保将其着色到我的jar中。