好的,我以为我了解如何使用Maven ...
我有一个主项目M
具有子项目A
,B
和C
。C
包含A
和所需的一些常用功能(主要是接口)B
。我可以运行mvn compile jar:jar
从项目的根目录(该M
目录),并得到JAR文件A.jar
,B.jar
和C.jar
。(所有这些工件的版本当前都是2.0-SNAPSHOT
。)
目录中的主pom.xml
文件在其标签下列出,因此和可以通过仅包含引用来进行引用,如下所示:M
C
<dependencyManagement>
A
B
C
<dependency>
<groupId>my.project</groupId>
<artifactId>C</artifactId>
</dependency>
到目前为止,一切都很好。我可以从命令行运行mvn compile
,一切正常。但是,当我在NetBeans中打开项目时,它抱怨这个问题:“某些依赖项不在本地存储库中”,并且说缺少的项是C
。同样,从命令行,如果我切换到A
或B
目录并尝试运行,则会mvn compile
收到“生成错误:无法解析工件的信息”。
我希望可以手动转到C.jar
构建和运行的位置mvn install:install-file
,但是我宁愿找到一个解决方案,使我能够直接在NetBeans(和/或使用m2eclipse的Eclipse)中工作。
我究竟做错了什么?
Maven依赖于二进制依赖项的概念,并通过本地存储库解决它们。换句话说,如果它们之间有依赖性,则需要在本地存储库中“安装”软件包,编译和打包代码是不够的。为此,您需要运行install
(将包安装到本地存储库中,以作为本地其他项目的依赖项)。
旁注:您不应该调用mvn compile jar:jar
而是喜欢mvn package
。首先,运行该package
阶段将触发之前的所有阶段package
(包括compile
)及其package
本身。其次,运行package
将根据项目的值调用jar:jar
,或war:war
等等<packaging>
(有关更多详细信息,请参见生命周期介绍)。这是Maven的最大优势之一:您不需要知道项目是JAR,WAR,EJB等,也不需要运行适当的目标来打包它。只需运行标准化package
阶段,Maven即可完成工作(使用默认目标绑定)。
那是关于Maven理论的部分。在IDE内部,为了使使用Maven更加方便,事情可能略有不同。IDE可以使用项目依赖项(即,IDE中对代码的依赖项)而不是二进制依赖项,以便使一个项目中所做的更改在其他模块中可见,而无需运行mvn install
。Eclipse + M2Eclipse就是这种情况。在以下情况下,这也适用于NetBeans(请参阅Dependency Management):
提示:如果打开其他项目所依赖的项目,则其他项目中的图标将更改为“行项目”图标,以表示IDE知道项目之间的链接。但是,仅当groupId,artifactId和version在依赖项和项目声明中均匹配时,才建立这样的链接。经常发生的问题是您在库项目中更改了API签名,但是应用程序没有启动。通常,这是由于应用程序使用的是旧版本的库工件。工件图标可以帮助您查找这些问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句