Maven模块依赖源而不是存储库jar

时间:2016-08-15 20:42:58

标签: maven

我有一个多模块项目,即

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安装工件后,它们都按预期工作。

但是,这至少在两个方面存在问题:

  • 我必须经历较慢的安装阶段而不是更快的编译阶段
  • 我有两个版本的同一个项目,并且在这些版本中有相互矛盾的修改。我不能运行相同的Java类及其各自的修改,只有当前安装的修改,考虑到它们都是相同的SNAPSHOT版本

两者都有解决方法(跳过第一部分的构建,第二部分的不同快照版本),但它们在实践中远非可用。

有没有办法让maven使用本地模块,而不是使用本地maven存储库中的工件?

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,看起来你的生活有点超出常规:你有两个本地“副本”的项目有不同的修改,你想在运行“exec:java时交替使用”。 Maven正在阻碍你:它希望你的本地.m2存储库区域在运行,但每个副本中的版本字符串是相同的,所以你最终会在副本之间干扰这些更改。

对我来说,听起来你要做的就是测试你的变化。我建议你在module2中编写一个实际的JUnit或TestNG测试来测试你想要的东西(如果你愿意,可以调用mod2.B Main)。然后,从您选择的项目目录中,您可以运行mvn test -Dtest=MyTestName。它不会“安装”任何东西,它会以你想要的方式找到依赖项。

否则,我可以看到三个选项。

  1. 在其中一个副本中更改本地版本字符串(mvn versions:set -DnewVersion=B-SNAPSHOT可以为您执行此操作)。这样,来自您对该副本的工作的任何“已安装”罐子将不会被另一个副本考虑,反之亦然。你认为这是“远远无法使用”......我认为它应该没问题?这些是项目的不同版本!他们应该有不同的版本字符串!我强烈推荐这三个中的这个选项。 (完成后,如果您使用mvn versions:revert,则可以执行:set,或者您可以依靠版本控制撤消更改。)
  2. 选择Maven在处理其中一个项目时使用的其他本​​地存储库,并使用https://stackoverflow.com/a/7071791/58549命令行标记。我不认为这是一个很好的解决方案,因为每次使用两个项目时都必须非常小心地使用正确的标志。此外,您最终还是必须将Maven插件和任何其他依赖项重新下载到新的本地存储库中,这样做会浪费时间。
  3. 尽量避免在所有中使用任何本地存储库。您似乎正在尝试使此选项有效。我认为这也不是一个好方法;你正在与Maven的期望作斗争,它会极大地限制你的灵活性。 Maven确实会首先从“reactor”(即执行mvn进程)中找到依赖关系,但这意味着所有必需的模块必须在找到的reactor中可用,这意味着您只能运行{{ 1}}在顶层。因此,如果您只想在单个模块中执行“mvn exec:java”,则mvn需要在某处找到该模块的依赖项......这就是本地存储库通常用于的目的。
  4. 如果你已经开始使用选项3(而不是选项1),那么我建议你按照你的问题上的评论创建一个配置文件,有选择地针对module2运行你的mvn并将其绑定到生命周期阶段。但这实际上非常接近于仅仅通过测试来包装它。