Maven如何处理从父级继承的传递依赖?

时间:2016-09-22 18:49:20

标签: maven transitive-dependency

鉴于以下父母和子女pom,{-# LANGUAGE TypeFamilyDependencies #-} module TFLoop where import Data.Proxy main :: IO () main = return $ f Proxy Proxy (Just 'c') data D1 x data D2 type family TF d a = t | t -> d a type instance TF (D1 x) a = Maybe (TF x a) type instance TF D2 () = Char f :: proxy1 x -> proxy2 a -> TF x a -> () f _ _ _ = () lib1都包含课程lib2

父pom

foo.bar.Test

child pom

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>foo</groupId>
    <artifactId>foo-parent</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>my.transitive</groupId>
            <artifactId>lib1</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

如果我在<project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>foo</groupId> <artifactId>foo-parent</artifactId> <version>1.0</version> </parent> <artifactId>foo-child</artifactId> <dependencies> <dependency> <groupId>my.transitive</groupId> <artifactId>lib2</artifactId> <version>1.0</version> </dependency> </dependencies> </project> 中包含foo-child作为依赖项并实例化myApp,那么Maven将解析哪个版本的类?为什么?

我的应用pom

foo.bar.Test

1 个答案:

答案 0 :(得分:3)

简短的回答是:它取决于首先在类路径中找到哪一个。

将2个相同的类与应用程序打包在一起并不理想,因为它可能导致许多难以调试的错误...如果你的myApp项目只是一个jar,那么最好使用它来编译它与在运行时可用的库相同的库。

我相信maven使用它写入pom的顺序来构建。查看此方法的一种方法是为myApp运行以下命令:

mvn依赖:tree -Dverbose

这将按照每个规范在类路径中出现的顺序打印依赖项。您始终可以使用排除项来排除您可能不需要的任何继承库。希望这会有所帮助。