我有一个多模块项目,即
parent
module1
module2
在一个开发周期中,我向module1添加了一个类mod1.A
。 module2中的类mod2.B
取决于它。
我的本地.m2/repository
中没有工件。运行这个:
$ cd prj/module2
$ mvn -o exec:java -Dexec.mainClass=mod2.B
导致错误:
The following artifacts could not be resolved: com.example:module1:jar:1.0-SNAPSHOT
在mvn install
文件夹中通过prj
安装工件后,它们都按预期工作。
但是,这至少在两个方面存在问题:
两者都有解决方法(跳过第一部分的构建,第二部分的不同快照版本),但它们在实践中远非可用。
有没有办法让maven使用本地模块,而不是使用本地maven存储库中的工件?
答案 0 :(得分:2)
如果我理解你的问题,看起来你的生活有点超出常规:你有两个本地“副本”的项目有不同的修改,你想在运行“exec:java时交替使用”。 Maven正在阻碍你:它希望你的本地.m2
存储库区域在运行,但每个副本中的版本字符串是相同的,所以你最终会在副本之间干扰这些更改。
对我来说,听起来你要做的就是测试你的变化。我建议你在module2中编写一个实际的JUnit或TestNG测试来测试你想要的东西(如果你愿意,可以调用mod2.B Main)。然后,从您选择的项目目录中,您可以运行mvn test -Dtest=MyTestName
。它不会“安装”任何东西,它会以你想要的方式找到依赖项。
否则,我可以看到三个选项。
mvn versions:set -DnewVersion=B-SNAPSHOT
可以为您执行此操作)。这样,来自您对该副本的工作的任何“已安装”罐子将不会被另一个副本考虑,反之亦然。你认为这是“远远无法使用”......我认为它应该没问题?这些是项目的不同版本!他们应该有不同的版本字符串!我强烈推荐这三个中的这个选项。 (完成后,如果您使用mvn versions:revert
,则可以执行:set
,或者您可以依靠版本控制撤消更改。)mvn
进程)中找到依赖关系,但这意味着所有必需的模块必须在找到的reactor中可用,这意味着您只能运行{{ 1}}在顶层。因此,如果您只想在单个模块中执行“mvn exec:java”,则mvn需要在某处找到该模块的依赖项......这就是本地存储库通常用于的目的。如果你已经开始使用选项3(而不是选项1),那么我建议你按照你的问题上的评论创建一个配置文件,有选择地针对module2运行你的mvn
并将其绑定到生命周期阶段。但这实际上非常接近于仅仅通过测试来包装它。