为提前使用首字母缩略词道歉。
我正在使用Maven项目Foo
,这取决于本地jar Bar
。 Bar
也是使用Maven构建的,因为它是一个本地jar,我在Foo
的文件夹结构中创建了一个本地存储库,并将jar放在那里。
Bar.jar
放在base_dir_of_Foo\repo\group_ID\artifact_ID\1.0-SNAPSHOT\Bar.jar
。
我遇到的问题是,当我正在运行Foo
时,它会抛出一个NoClassDefFoundError
,因为它无法找到一个班级Bar
的依赖项之一。因此,Foo
通过Bar
错过了传递依赖。
有一点需要注意的是,当我为mvn clean package
运行Foo
时,我看到一个警告说"错过POM for Bar"。 Foo
使用反射调用B
,Foo
能够找到Bar
中定义的类,但看起来A
无法弄清{ {1}}的依赖关系。知道为什么会这样吗?
本地回购广告在Bar
' Foo
中定义:
pom.xml
最后<repositories>
<repository>
<id>local-repo</id>
<name>Local</name>
<url>file://${basedir}/repo</url>
</repository>
</repositories>
取决于具有默认编译范围的Foo
:
Bar
更新 我发现为什么找不到Bar的pom,这是因为我把Bar.jar放在本地repo上,maven只会将jar文件复制到本地仓库缓存中,它不会从jar中提取pom.xml,这是预期?
在C:\ Users \ hancwang.m2 \ repository \ group-id \ Bar \ 1.0-SNAPSHOT中,我看到Bar-1.0-snapshot.jar被复制了,但是没有Bar -1.0-snapshot.pom。
答案 0 :(得分:1)
您的<repository>
定义可能指向不完整的存储库,例如一个repo缺少.pom
文件。
假设您在本地构建Bar源代码,如果在Bar中运行mvn install
,您将在本地存储库中安装其工件。这样,Foo会正常找到Bar。在这种情况下,您不需要定义<repository>
。
所以,试着:
mvn install
或mvn clean install
<repository>
jar file://
定义