当前位置: 首页 > 知识库问答 >
问题:

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

傅自明
2023-03-14

我有一个多模块的项目,即。

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

然而,这至少从两个方面提出了一个问题:

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

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

共有1个答案

陈翰林
2023-03-14

如果我正确理解您的问题,那么您似乎有点超出了常规:您有两个带有不同修改的项目的本地“副本”,您希望在运行“exec:java”时交替使用这些副本。Maven正在阻碍您的工作:它希望您的本地.m2存储库区域发挥作用,但每个副本中的版本字符串都是相同的,因此您最终会在副本之间进行更改。

对我来说,这听起来像是你试图做的是测试你的改变。我建议您只需在module2中编写一个实际的JUnit或TestNG测试,测试您想要的内容(如果需要,它可以直接调用mod2.b Main)。然后,从您选择的项目目录中,您可以运行mvn test-dtest=mytestname。它不会“安装”任何东西,它会按照您希望的方式找到依赖项。

否则,我可以看到三种选择。

  1. 在其中一个副本中本地更改版本字符串(mvn versions:set-dnewversion=b-snapshot可以为您执行此操作)。这样,您在该副本上工作的任何“安装”JAR都不会被另一个副本考虑,反之亦然。你说这个“远不能用”...我想应该没问题?这些是项目的不同版本!它们应该有不同的版本字符串!在这三个选项中,我强烈推荐这个选项。(如果使用了:set,则可以执行MVN版本:还原,或者可以依赖版本控制撤消更改。)
  2. 使用https://stackoverflow.com/a/7071791/58549命令行标志,选择Maven在处理其中一个项目时使用的不同本地存储库。我真的不认为这是一个好的解决方案,因为您必须非常小心地使用正确的标志,每次与两个项目。而且,您最终不得不将Maven插件和任何其他依赖项重新下载到新的本地存储库中,这有点浪费时间。
  3. 尽量避免使用任何本地存储库。你似乎在努力让这个选项奏效。我也不认为这是一个很好的方法;您正在与Maven的期望作斗争,这大大限制了您的灵活性。Maven确实会首先从“反应器”(即正在执行的mvn进程)中查找依赖项,但这意味着所有必需的模块必须在要查找的反应器中可用,这意味着您只能在顶层运行mvn。因此,如果您只想在单个模块中执行“mvn exec:java”,则mvn需要在某个地方找到该模块的依赖项...这就是本地回购通常的用途。

如果您坚持使用选项3(而不是选项1),那么我建议您按照问题上的注释创建一个配置文件,该配置文件针对module2选择性地运行exec,并将其绑定到一个生命周期阶段。但在实践中,这非常接近于用一个测试来包装它。

 类似资料:
  • 我有一个多模块项目,其中两个子模块中的一个依赖于另一个。这个问题意味着应该处理这些依赖关系。 在我的机器上的本地级别上一切都很好(在Eclipse内部和命令行上)。但是,当我更新修改第二个模块所需代码的模块并提交到我的github存储库时,第二个模块将无法构建Travis CI。我将问题追溯到这样一个事实,即它正在从存储库下载其依赖项,而不是使用它刚刚编译的存储库。 和父pom.xml的摘录: 完

  • 我试图在我的文件系统上为maven和gradle维护相同的存储库。但是我遇到了一些问题。 我的 GRADLE_USER_HOME是 我的gradle主页与我的Maven存储库相同。 但是,当通过gradle下载依赖项时,它们将被下载到gradle\u USER\u HOME\cache中,而不是存储库文件夹中。我缺少什么配置? 编辑我已经查看了《Gradle In Action》一书中关于依赖关系

  • 我有这个项目https://github.com/andreacatania/libreria 它有三个模块“deWeb”“decore”“libreriaear” 模块libreriaEar创建了一个带有deweb和decore模块的EAR存档。我试图将Hibernate使用到模块“decore”中,但maven没有将依赖项导入到“decore”模块中,因此我收到了NoClassFoundExc

  • 我在Maven中有一个相当简单的带有子模块的项目结构: 在中,我定义了所有子模块的属性,如库版本或插件配置: 直接在节点中设置库版本。 在中设置节点。 尝试不同的库版本。 使用以及库是否存在。 在中运行。 在中运行。 在中运行 在中运行。 在中运行。

  • 我对maven是新手,在将pom.xml中定义的依赖项下载到本地存储库时遇到了问题。正确下载pom.xml中定义的所有其他依赖项。此外,跨多个项目的其他依赖关系也运行良好。我使用的是maven 3.5.2和aws sdk 1.11.86 导致问题的依赖项是定义为的aws红移驱动程序- Maven存储库- 我的本地回购协议有以下内容- 我已经删除了本地文件。上次更新的文件,但无法解决此问题<有什么想

  • 问题内容: 我有一个多模块项目:父POM.xml: rest-client-microservice的POM.xml如下所示: email-commons模块的POM.xml如下所示: 如果我尝试在父项目上执行,则会得到以下结果: 我已经在这个问题上困扰了好几天,但是我不知道为什么这不起作用。 问题答案: 我想到了。rest-client-microservice是一个Spring Boot项目,