使用Maven进行软件版本控制和多模块项目的最佳实践是什么?
我的意思是,当我使用Maven创建一个多模块项目时,版本控制的最佳方法是什么?为所有模块使用单个版本(在顶部项目中定义)?要为每个模块使用一个版本(在每个模块的POM中定义)?我还缺少另一种方法吗?每种方法的优缺点是什么?
通常,不同的模块是否一起发布(可能共享相同的版本号)?
谢谢
Spring在Maven构建的验证阶段,为多个引导应用程序运行端到端集成测试的推荐方法是什么?
基本上,我有一个多模块Maven项目,其中几个模块是独立的弹簧启动应用程序.这些单独的应用程序有自己的数据源配置,带JMS队列的集成流等.例如,应用程序A将轮询数据库中的事件,当发生这种情况时,它会生成JSON数据文件并将消息放入JMS队列.应用程序B正在轮询JMS队列,因此选择消息,读取文件,使用另一个数据库执行某些处理,并将消息放在不同的队列中.然后,应用程序C将接收该消息等.
我已经为各个应用程序设置了集成测试; 这些在Maven故障安全插件下运行.但是,我想整合测试整个系统,端到端,在Maven下.我在专用于此任务的项目中设置了一个单独的模块,因此希望此模块的验证构建阶段使用其他相关模块进行端到端测试.
这样做有最佳实践方法吗?我看到3种可能的方式:
Mavenbuild/failsafe插件的任何注意事项吗?integration-testing end-to-end maven multi-module spring-boot
如何更新子模块的版本?有很多类似这样的Stackoverflow问题,但是我找不到适合这种情况的问题...如果这是重复的话,我会很高兴.
考虑以下项目.
parent
--mod1
--mod2
Run Code Online (Sandbox Code Playgroud)
在开发阶段开始时,我需要将父模块和模块更新为相同的版本.如果父版本和模块的版本在整个版本中保持不变,那么我将只省略<version>模块中的标记并执行versions:set -DnewVersion=1.1.1以启动开发周期.但事实证明,模块不会以相同的版本结束循环.由于错误和修复只能实现那些带有错误的模块,因此会更新.例如,parent和mod2可能是版本1.1.1-RC1,但mod1可能是1.1.1-RC2.
因此,我需要:
1)<version>在模块中包含一个标签,以独立跟踪每个模块版本.
2)如果mod2需要mod1作为依赖项,我需要确保mod2引用最新版本的mod1.
这导致以下两个问题.
1)在循环开始时如何在一个maven命令中将父模块和模块设置为相同的版本?我试过了version:set -DnewVersion=1.1.1,但这只是更新了所有POM的父版本,而不是模块的版本.我也尝试了-N versions:update-child-modules,但我认为我使用它是错误的,因为它什么也没做,只是跳过了所有模块.
2)这有点难,与上面第2项相符.如何一步更新mod1的版本和mod2对mod1版本的引用?我知道如何分两步完成:
父母pom:
<properties>
<!-- update this manually if mod1's version no longer matches parent -->
<mod1.version>${project.version}</mod1.version>
</properties>
Run Code Online (Sandbox Code Playgroud)
mod2 pom:
<dependency>
<groupId>com.xxx</groupId>
<artifactId>mod1</artifactId>
<version>${mod1.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当mod1碰到1.1.1-RC2时,我更新父POM和mod1 POM以反映这一点.这是两个步骤.无论如何把它变成一步?
我的例子虽小,但在现实生活中有许多模块可以节省大量时间,而且我很好奇.
在与Maven合作一段时间后,我对Maven为构建体系结构带来的许多功能感到兴奋,特别是依赖管理.但是,我一次又一次遇到一个问题--Maven如何解决多模块项目之间的依赖关系.我想知道这是否是当前Maven实施的一个重大缺陷和/或是否有任何令人满意的解决方法.
假设我有一个多模块Maven项目.Parent pom包含三个模块 - moduleA(jar),moduleB(jar)和moduleC(war).B取决于A和C取决于B.简单吗?现在我想mvn dependency:go-offline在父项目上运行,该项目应该解析所有依赖项并将它们带入本地.m2目录.它失败了,因为Maven抱怨说当它作用于moduleB时它无法解决moduleA的依赖关系.因为所有这些模块都属于一个groupId,我甚至尝试使用它-DexcludeGroupIds=x.y.z来排除这些模块依赖关系,但它仍然在同一点上失败.
我理解为什么Maven抱怨 - moduleA还没有构建,因此当执行脱机目标时,我的本地或内部存储库中没有moduleA:jar工件.但IMHO插件应该以不同方式处理这些模块间依赖关系.在这种情况下,它应该简单地忽略它.有人可能会说我可以这样做mvn clean install,它会将moduleA:jar安装到本地存储库中.在那之后,运行mvn dependency:go-offline肯定会起作用.但是这种解决方法违背了这个离线目标的目的.这个插件允许我们解析并将依赖项拉入我们的本地存储库,而无需构建整个项目.我dependency:copy-dependencies在另一个案例中使用了目标,它有同样的问题.
我在其他场景中也遇到了类似的问题:"mvn clean generate-source"无法解决依赖关系.当我运行时mvn clean compile,一切正常,但是当我运行时mvn clean generate-source,它失败了,因为Maven无法解决模块间依赖性.在那种情况下,这是由@requiresDependencyResolutionantrun插件引起的.
由于antrun插件和依赖插件在Maven世界中非常流行,我相信我不是唯一遇到过这个问题的人.有人发现任何解决方案/解决方法吗
我将创建一个多模块原型.它将生成几个模块.原型的一些用户可能需要所有这些用户,而有些用户只需要其中的一些用户.
我的原型可以从命令行获取参数并决定生成哪些模块吗?我检查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html ,它似乎不支持.
我有一个多模块项目:父POM.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<groupId>be.bodyreset</groupId>
<artifactId>bodyreset-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Bodyreset Parent</name>
<description>Manages the common properties and dependencies for the child modules</description>
<modules>
<module>bodyreset-commons</module>
<module>messaging-contract</module>
<module>discovery-microservice</module>
<module>api-gateway-microservice</module>
<module>rest-client-microservice</module>
<module>email-commons</module>
<module>security-microservice</module>
<module>user-microservice</module>
<module>point-of-service-microservice</module>
</modules>
<properties>
<docker.image.prefix>bodyreset</docker.image.prefix>
<java.version>1.8</java.version>
<powermock.version>1.6.6</powermock.version>
</properties>
<dependencyManagement>
<dependencies>
...
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
rest-client-microservice的POM.xml如下所示:
<?xml …Run Code Online (Sandbox Code Playgroud) 我正在努力从我的自定义库中自动装配bean,并使用gradle导入.在阅读了几个类似的主题后,我仍然无法找到解决方案.
我有Spring Boot项目,它依赖于其他项目(我的自定义库包含Components,Repositories等...).该库是一个Spring不可运行的jar,主要由域实体和存储库组成.它没有可运行的Application.class和任何属性......
当我启动应用程序时,我可以看到我的'CustomUserService'bean(来自库)正在尝试初始化,但是在其中自动装配的bean无法加载(接口UserRepository)...
错误:
com.myProject.customLibrary.configuration.CustomUserDetailsService中构造函数的参数0需要一个无法找到的类型为"com.myProject.customLibrary.configuration.UserRepository"的bean.
我甚至试图设置'Order',显式加载它(使用'scanBasePackageClasses'),使用包和标记类扫描,添加额外的'EnableJPARepository'注释但没有任何效果......
代码示例(为简单起见,包名称已更改)
package runnableProject.application;
import runnableProject.application.configuration.ServerConfigurationReference.class
import com.myProject.customLibrary.SharedReference.class
//@SpringBootApplication(scanBasePackages = {"com.myProject.customLibrary", "runnableProject.configuration"})
//@EnableJpaRepositories("com.myProject.customLibrary")
@SpringBootApplication(scanBasePackageClasses = {SharedReference.class, ServerConfigurationReference.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
来自图书馆的课程:
package com.myProject.customLibrary.configuration;
import com.myProject.customLibrary.configuration.UserRepository.class;
@Service
public class CustomUserDetailsService implements UserDetailsService {
private UserRepository userRepository;
@Autowired
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
...
package myProject.customLibrary.configuration;
@Repository
public interface UserRepository extends CustomRepository<User> {
User findByLoginAndStatus(String var1, Status var2);
...
}
Run Code Online (Sandbox Code Playgroud) multi-module spring-data-jpa spring-ioc spring-boot component-scan
我的Maven项目有大约七个子模块.其中六个打包为JAR,另一个打包为WAR.
我应该在每个模块中创建单独的logback.xml配置吗?或者我应该有一个所有其他模块所依赖的"通用"模块,并在其中放置一个单独的logback.xml?还有其他选择吗?
谢谢.
我想知道如何在IntelliJ中配置以下项目布局:
最初,我想在相同的层次结构级别上创建三个模块.但是,IntelliJ似乎无法做到这一点.我只能在第一个模块中添加新模块.我想知道这是不是我应该这样做的方式?或者有更好的方法使用IntelliJ配置此项目布局?这些层次结构只代表文件夹吗?
我觉得我应该制作(3)库模块并将依赖项添加到(1)和(2).由于模块被定义为一个独立的功能单元,您可以独立编译,运行,测试和调试,我觉得这是正确的方法.
这是我在IntelliJ中的第一个多模块项目.任何解释都表示赞赏!
如何将maven多模块项目正确导入eclipse?当我导入新的maven项目并选择父pom时,我可以看到父pom下的子模块,它们在包资源管理器和项目资源管理器中可见.但是,它们被呈现为深层目录结构,就好像eclipse不知道它们是java项目.
当我展开子模块项目时,我没有看到java包快捷方式,因为我打开了一个maven项目.我只把它看作一个深层目录结构.如何导入multimodule maven项目并打开子模块项目以利用eclipse java项目功能?
multi-module ×10
maven ×8
java ×4
module ×2
spring-boot ×2
config ×1
eclipse ×1
end-to-end ×1
project ×1
slf4j ×1
spring-ioc ×1
versioning ×1