嵌套的maven多模块spring boot项目

Posted

技术标签:

【中文标题】嵌套的maven多模块spring boot项目【英文标题】:Nested maven multi module spring boot project 【发布时间】:2020-10-18 01:42:38 【问题描述】:

所以我想构建一个具有以下结构的项目:

Project[pom.xml]
-----module 1[pom.xml]
     -----sub-module 1[pom.xml]
     -----sub-module 2[pom.xml]
     -----sub-module 3[pom.xml]
-----module 2[pom.xml]
-----module 3[pom.xml]

现在,模块 1 和模块 2 是模块 3 的依赖项。


问题1:这种方法有问题吗?


问题2:当我实现这个时,该项目的包装结构为 pom,用于父 pom 和模块 1,而包装结构为模块 1、模块 2 和模块 3 的子模块。 现在当我运行 mvn clean install 时,我得到了这个错误:

org.apache.maven.lifecycle.LifecycleExecutionException:无法在项目 foo-module3 上执行目标:无法解析项目 com.org:foo-module3:jar:0.0.1-SNAPSHOT 的依赖项:找不到 com。 ***/libs-snapshot 中的 org:foo-module1:jar:0.0.1-SNAPSHOT 已缓存在本地存储库中,直到经过 central2 的更新间隔或强制更新后才会重新尝试解析
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:269)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:147)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:248)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:202)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    在 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    在 org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    在 org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    在 org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    在 org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke (Method.java:498)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
原因:org.apache.maven.project.DependencyResolutionException:无法解析项目 com.org:foo-module3:jar:0.0.1-SNAPSHOT 的依赖项:找不到 com.org:foo-module1:jar:0.0。 ***/libs-snapshot 中的 1-SNAPSHOT 已缓存在本地存储库中,直到 central2 的更新间隔已过或强制更新后才会重新尝试解析
    在 org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:209)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:243)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:147)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:248)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:202)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    在 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    在 org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    在 org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    在 org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    在 org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke (Method.java:498)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
引起:org.eclipse.aether.resolution.DependencyResolutionException: 找不到com.oorg:foo-module1:jar:0.0.1-SNAPSHOT in ***/libs-snapshot 缓存在本地仓库,解析不会重新尝试,直到 central2 的更新间隔已过或强制更新
    在 org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies (DefaultRepositorySystem.java:357)
    在 org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:202)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:243)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:147)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:248)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:202)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    在 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    在 org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    在 org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    在 org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    在 org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke (Method.java:498)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
原因:org.eclipse.aether.resolution.ArtifactResolutionException: 找不到 com.org:foo-module1:jar:0.0.1-SNAPSHOT in ***/libs-snapshot 缓存在本地仓库,解析不会重新尝试,直到 central2 的更新间隔已过或强制更新
    在 org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:424)
    在 org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:229)
    在 org.jfrog.build.extractor.maven.resolver.ArtifactoryEclipseArtifactResolver.resolveArtifacts (ArtifactoryEclipseArtifactResolver.java:56)
    在 org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies (DefaultRepositorySystem.java:340)
    在 org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:202)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:243)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:147)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:248)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:202)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    在 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    在 org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    在 org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    在 org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    在 org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke (Method.java:498)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
原因:org.eclipse.aether.transfer.ArtifactNotFoundException: Failure to find com.org:foo-module1:jar:0.0.1-SNAPSHOT in ***/libs-snapshot 缓存在本地仓库,解析不会重新尝试,直到 central2 的更新间隔已过或强制更新
    在 org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.newException (DefaultUpdateCheckManager.java:218)
    在 org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.checkArtifact (DefaultUpdateCheckManager.java:193)
    在 org.eclipse.aether.internal.impl.DefaultArtifactResolver.gatherDownloads (DefaultArtifactResolver.java:559)
    在 org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads (DefaultArtifactResolver.java:483)
    在 org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:401)
    在 org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:229)
    在 org.jfrog.build.extractor.maven.resolver.ArtifactoryEclipseArtifactResolver.resolveArtifacts (ArtifactoryEclipseArtifactResolver.java:56)
    在 org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies (DefaultRepositorySystem.java:340)
    在 org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:202)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:243)
    在 org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:147)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:248)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:202)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    在 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    在 org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    在 org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    在 org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    在 org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    在 org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke (Method.java:498)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
[错误]
[错误] 使用 -X 开关重新运行 Maven 以启用完整的调试日志记录。
[错误]
[错误] 有关错误和可能的解决方案的更多信息,请阅读以下文章:
[错误] [帮助 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[错误]
[错误] 更正问题后,您可以使用命令恢复构建
[错误] mvn  -rf :foo-module3

【问题讨论】:

【参考方案1】:

这种方法没有错。事实上,我已经建立了一个具有类似设计的项目。如果您添加了 module1 和 module2 作为 module3 的依赖项,那么您必须首先确保将 module1 和 module2 安装在本地 .m2 存储库中。

为了进行测试,您可以先在模块 1 和模块 2 中运行 mvn install。在 mvn 控制台日志中,您也会看到 /path/to/your/module1/jar 安装在 /local/directory/.m2/... 中,您可以验证您的模块是否安装正确。 然后就可以在module3中运行mvn isntall....

【讨论】:

以上是关于嵌套的maven多模块spring boot项目的主要内容,如果未能解决你的问题,请参考以下文章

Maven 搭建spring boot多模块项目(附源码)

带有 Spring Data 的 Spring Boot Maven 多模块项目

Spring-Boot构建多模块项目

了解多模块项目中的 Spring Boot Maven 插件

Spring boot application.properties maven 多模块项目

Spring Boot maven 多模块项目——单元测试(应用上下文)