标签: multi-module

Maven:多模块项目和版本控制

使用Maven进行软件版本控制和多模块项目的最佳实践是什么?

我的意思是,当我使用Maven创建一个多模块项目时,版本控制的最佳方法是什么?为所有模块使用单个版本(在顶部项目中定义)?要为每个模块使用一个版本(在每个模块的POM中定义)?我还缺少另一种方法吗?每种方法的优缺点是什么?

通常,不同的模块是否一起发布(可能共享相同的版本号)?

谢谢

versioning maven multi-module

20
推荐指数
2
解决办法
7910
查看次数

Maven下多个Spring启动应用程序的端到端集成测试

SpringMaven构建的验证阶段,为多个引导应用程序运行端到端集成测试的推荐方法是什么?

基本上,我有一个多模块Maven项目,其中几个模块是独立的弹簧启动应用程序.这些单独的应用程序有自己的数据源配置,带JMS队列的集成流等.例如,应用程序A将轮询数据库中的事件,当发生这种情况时,它会生成JSON数据文件并将消息放入JMS队列.应用程序B正在轮询JMS队列,因此选择消息,读取文件,使用另一个数据库执行某些处理,并将消息放在不同的队列中.然后,应用程序C将接收该消息等.

我已经为各个应用程序设置了集成测试; 这些在Maven故障安全插件下运行.但是,我想整合测试整个系统,端到端,在Maven下.我在专用于此任务的项目中设置了一个单独的模块,因此希望此模块的验证构建阶段使用其他相关模块进行端到端测试.

这样做有最佳实践方法吗?我看到3种可能的方式:

  1. 将每个应用程序的配置加载到同一应用程序上下文中.但是,由于存在多个数据源等,这会产生冲突,因此这些数据源都必须手动配置才能实现端到端集成测试 - 所以这对我来说似乎不对.
  2. 将每个应用程序作为一个单独的进程启动 - 然后如何正确地跟踪它们并确保它们在测试模块构建停止/崩溃/等时关闭?
  3. 有没有办法在同一个进程中轻松加载单独的Spring引导应用程序,每个应用程序都有自己的配置上下文?这似乎是最明智的选择.有关Mavenbuild/failsafe插件的任何注意事项吗?

integration-testing end-to-end maven multi-module spring-boot

19
推荐指数
2
解决办法
2581
查看次数

如何在Maven中更新子模块的版本?

如何更新子模块的版本?有很多类似这样的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以反映这一点.这是两个步骤.无论如何把它变成一步?

我的例子虽小,但在现实生活中有许多模块可以节省大量时间,而且我很好奇.

java module maven multi-module

18
推荐指数
1
解决办法
1万
查看次数

如何解决多模块项目中模块之间的依赖关系?

在与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世界中非常流行,我相信我不是唯一遇到过这个问题的人.有人发现任何解决方案/解决方法吗

dependency-management maven multi-module

16
推荐指数
3
解决办法
1万
查看次数

可以将多模块maven原型设置为具有可选模块吗?

我将创建一个多模块原型.它将生成几个模块.原型的一些用户可能需要所有这些用户,而有些用户只需要其中的一些用户.

我的原型可以从命令行获取参数并决定生成哪些模块吗?我检查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html ,它似乎不支持.

maven multi-module maven-archetype

14
推荐指数
2
解决办法
2560
查看次数

找不到Maven多模块依赖包

我有一个多模块项目:父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)

java maven multi-module

14
推荐指数
2
解决办法
7812
查看次数

Spring Boot:从库项目中自动装配bean

我正在努力从我的自定义库中自动装配bean,并使用gradle导入.在阅读了几个类似的主题后,我仍然无法找到解决方案.

我有Spring Boot项目,它依赖于其他项目(我的自定义库包含Components,Repositories等...).该库是一个Spring不可运行的jar,主要由域实体和存储库组成.它没有可运行的Application.class和任何属性......

当我启动应用程序时,我可以看到我的'CustomUserService'bean(来自库)正在尝试初始化,但是在其中自动装配的bean无法加载(接口UserRepository)...

错误:

com.myProject.customLibrary.configuration.CustomUserDetailsS​​ervice中构造函数的参数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

14
推荐指数
4
解决办法
8510
查看次数

如何在多模块Maven项目中配置slf4j + logback?

我的Maven项目有大约七个子模块.其中六个打包为JAR,另一个打包为WAR.

我应该在每个模块中创建单独的logback.xml配置吗?或者我应该有一个所有其他模块所依赖的"通用"模块,并在其中放置一个单独的logback.xml?还有其他选择吗?

谢谢.

java config slf4j maven multi-module

13
推荐指数
1
解决办法
5731
查看次数

如何在IntelliJ中设置具有相同层次结构模块的多模块项目?

我想知道如何在IntelliJ中配置以下项目布局:

  1. 一个Android应用程序
  2. 服务器后端向此应用程序提供数据
  3. 在后端和Android应用程序之间共享的Bean类

最初,我想在相同的层次结构级别上创建三个模块.但是,IntelliJ似乎无法做到这一点.我只能在第一个模块中添加新模块.我想知道这是不是我应该这样做的方式?或者有更好的方法使用IntelliJ配置此项目布局?这些层次结构只代表文件夹吗?

我觉得我应该制作(3)库模块并将依赖项添加到(1)和(2).由于模块被定义为一个独立的功能单元,您可以独立编译,运行,测试和调试,我觉得这是正确的方法.

这是我在IntelliJ中的第一个多模块项目.任何解释都表示赞赏!

module intellij-idea multi-module

13
推荐指数
1
解决办法
4737
查看次数

Eclipse,导入maven多模块项目

如何将maven多模块项目正确导入eclipse?当我导入新的maven项目并选择父pom时,我可以看到父pom下的子模块,它们在包资源管理器和项目资源管理器中可见.但是,它们被呈现为深层目录结构,就好像eclipse不知道它们是java项目.

当我展开子模块项目时,我没有看到java包快捷方式,因为我打开了一个maven项目.我只把它看作一个深层目录结构.如何导入multimodule maven项目并打开子模块项目以利用eclipse java项目功能?

(http://i68.tinypic.com/6p3i86.png)

java eclipse project maven multi-module

12
推荐指数
3
解决办法
7843
查看次数