好的,我想到我明白了如何使用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
可以引用{ {1}}只需包含一个引用,如下所示:
C
到目前为止,这么好。我可以从命令行运行<dependency>
<groupId>my.project</groupId>
<artifactId>C</artifactId>
</dependency>
,一切正常。但是当我在NetBeans中打开项目时,它会抱怨问题:“某些依赖项工件不在本地存储库中”,并且它表示缺少的工件是mvn compile
。同样,从命令行开始,如果我更改为C
或A
目录并尝试运行B
,我会收到“构建错误:无法解决工件。”
我希望我可以手动转到构建mvn compile
并运行C.jar
的位置,但我宁愿找到一种解决方案,使我能够直接在NetBeans中工作(和/或在Eclipse中)使用m2eclipse)。
我做错了什么?
答案 0 :(得分:23)
Maven依赖于二进制依赖的概念,并通过本地存储库解析它们。换句话说,如果您之间存在依赖关系,则需要在本地存储库中“安装”软件包,编译和打包代码是不够的。为此,您需要运行 install
(将将软件包安装到本地存储库,以用作本地其他项目的依赖项)。
附注:您不应该调用 mvn compile jar:jar
,而是更喜欢 mvn package
。首先,运行package
阶段将触发package
(包括compile
)和package
之前的所有阶段。其次,运行package
会调用jar:jar
或war:war
等,具体取决于项目的<packaging>
值(有关详细信息,请查看introduction to the lifecycle) 。这是Maven的一大优势:你不需要知道项目是JAR,WAR,EJB等,并且运行适当的目标来打包它。只需运行标准化package
阶段,Maven即可完成工作(使用默认目标绑定)。
那是Maven的理论部分。在IDE中,事情可能略有不同,使得使用Maven更方便。 IDE可以使用 项目依赖项 (即依赖于IDE中的代码)而不是二进制依赖项,以便在一个项目中进行的更改在其他模块中可见,而无需运行{ {1}}。这是Eclipse + M2Eclipse的情况。这也适用于以下条件下的NetBeans(请参阅Dependency Management):
提示:如果您打开其他项目 项目依赖于,其他的图标 项目变为“maven项目” 图标表示IDE知道 关于项目之间的联系。 但是这样的链接只是 在groupId时建立, artifactId和版本全部匹配 依赖和项目 宣言。经常发生 问题是你改变了一个API 您的图书馆项目中的签名,但是 应用程序没有恢复。 通常它是由事实引起的 应用程序使用的是旧版本 库神器。神器 图标可以帮助您追踪这些 问题。
答案 1 :(得分:6)
您需要运行mvn install
而不是mvn compile
。 install
目标将在编译和打包后将构建的jar复制到本地存储库中。如果只运行compile,它只会将类文件编译到target
目录中,而不会使它们可用于其他项目。
在Eclipse中,如果从顶层导入pom,它会将子项目导入单独的Eclipse项目并设置相关项目的依赖项,然后设置每个项目的类路径以依赖其他项目。我不熟悉Netbeans,但我很确定有一些方法可以做同样的事情。
答案 2 :(得分:3)
netbeans通过本地存储库内容将项目链接在一起,因此在大多数情况下都需要安装mvn。
答案 3 :(得分:0)
这不是真的,执行部署将完成之前的所有设置......
请看看:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html