鉴于以下父母和子女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
答案 0 :(得分:3)
简短的回答是:它取决于首先在类路径中找到哪一个。
将2个相同的类与应用程序打包在一起并不理想,因为它可能导致许多难以调试的错误...如果你的myApp项目只是一个jar,那么最好使用它来编译它与在运行时可用的库相同的库。
我相信maven使用它写入pom的顺序来构建。查看此方法的一种方法是为myApp运行以下命令:
mvn依赖:tree -Dverbose
这将按照每个规范在类路径中出现的顺序打印依赖项。您始终可以使用排除项来排除您可能不需要的任何继承库。希望这会有所帮助。