maven 配置 profiles

1.pom 使用 结构1 最父级parent 方案

1.1 以以下项目演示

ai
├─common-framework-all
│  ├─framework-knife4j
│  │  └─src
│  │      └─main
│  │          ├─java
│  │          │  └─com
│  │          │      └─minimalism
│  │          │          │  └─swagger
│  │          │          ├─config
│  │          │          └─scan
│  │          └─resources
│  └─framework-langchain4j
└─micro-service
    └─ai-langchain4j
            ├─main
            │  ├─java
            │  │  └─com
            │  │      └─minimalism
            │  │          └─ai
            │  │              └─langchain4j
            │  │                  ├─controller
            │  └─resources
            └─test
                └─java
                    └─com
                        └─example

ai pom

<?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 https://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>3.1.0</version>  
  </parent>  
  
 <groupId>com.minimalism</groupId>  
 <artifactId>ai</artifactId>  
 <version>0.0.1-SNAPSHOT</version>  
 <packaging>pom</packaging>  
  
 <properties>  
  <java.version>17</java.version>  
 <project-module.version>0.0.1-SNAPSHOT</project-module.version>  
 <project-module-ai.version>0.0.1-SNAPSHOT-AI</project-module-ai.version>  
 <project.Encoding>UTF-8</project.Encoding>  
 <spring-boot.version>3.1.0</spring-boot.version>  
  
 <maven.compiler.source>${java.version}</maven.compiler.source>  
 <maven.compiler.target>${java.version}</maven.compiler.target>  
 <project.build.sourceEncoding>${project.Encoding}</project.build.sourceEncoding>  
 <project.reporting.outputEncoding>${project.Encoding}</project.reporting.outputEncoding>  
  
 <hutool.version>5.8.25</hutool.version>  
 <lombok.version>1.18.26</lombok.version>  
  </properties>  
  
  <!--远程仓库-->  
  <repositories>  
  <repository>  
  <id>aliyun-public</id>  
 <url>https://maven.aliyun.com/nexus/content/groups/public/</url>  
  </repository>  
  
 <repository>  
  <id>aliyun</id>  
 <url>https://maven.aliyun.com/repository/public</url>  
 <releases>  
  <enabled>true</enabled>  
  </releases>  
 <snapshots>  
  <enabled>false</enabled>  
  </snapshots>  
  </repository>  
  
 <repository>  
  <id>snapshots-repo</id>  
 <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>  
 <snapshots>  
  <enabled>true</enabled>  
  </snapshots>  
  </repository>  
  </repositories>  
  
 <dependencyManagement>  
  <dependencies>  
  <dependency>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-dependencies</artifactId>  
 <version>${spring-boot.version}</version>  
 <type>pom</type>  
 <scope>import</scope>  
  </dependency>  
  </dependencies>  
  </dependencyManagement>  
     <modules>  
  <module>common-framework-all</module>  
 <module>micro-service</module>  
  </modules>  
  
 <dependencies>  
  <dependency>  
  <groupId>cn.hutool</groupId>  
 <artifactId>hutool-all</artifactId>  
 <version>${hutool.version}</version>  
  </dependency>  
  </dependencies>  
  
 <profiles>  
  <profile>  
  <id>test</id>  
 <properties>  
  <spring.profiles.active>test</spring.profiles.active>  
  </properties>  
 <activation>  
  <activeByDefault>true</activeByDefault>  
  </activation>  
  </profile>  
 <profile>  
  <id>dev</id>  
 <properties>  
  <spring.profiles.active>dev</spring.profiles.active>  
  </properties>  
  </profile>  
 <profile>  
  <id>prod</id>  
 <properties>  
  <spring.profiles.active>prod</spring.profiles.active>  
  </properties>  
  </profile>  
  </profiles>  
</project>

micro-service pom

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  
 <parent>  
  <groupId>com.minimalism</groupId>  
 <artifactId>ai</artifactId>  
 <version>0.0.1-SNAPSHOT</version>  
  </parent>  
  
 <artifactId>micro-service</artifactId>  
 <packaging>pom</packaging>  
  
  
 <modules>  
  <module>ai-langchain4j</module>  
  </modules>  
  
 <build>  
  <plugins>  
  <plugin>  
  <groupId>org.apache.maven.plugins</groupId>  
 <artifactId>maven-compiler-plugin</artifactId>  
 <version>3.8.1</version>  
 <configuration>  
  <source>${java.version}</source>  
 <target>${java.version}</target>  
 <encoding>${project.Encoding}</encoding>  
  </configuration>  
  </plugin>  
 <plugin>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-maven-plugin</artifactId>  
 <version>${spring-boot.version}</version>  
 <configuration>  
  <excludes>  
  <exclude>  
  <groupId>org.projectlombok</groupId>  
 <artifactId>lombok</artifactId>  
  </exclude>  
  </excludes>  
  </configuration>  
  
 <executions>  
  <execution>  
  <id>repackage</id>  
 <goals>  
  <goal>repackage</goal>  
  </goals>  
  </execution>  
  </executions>  
  </plugin>  
  </plugins>  
  </build>  
</project>

ai-langchain4j pom

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
 <parent>  
  <groupId>com.minimalism</groupId>  
 <artifactId>micro-service</artifactId>  
 <version>0.0.1-SNAPSHOT</version>  
  </parent>  
  
 <artifactId>ai-langchain4j</artifactId>  
  
 <properties>  
  <langchain4j.version>1.0.0-alpha1</langchain4j.version>  
  </properties>  
  
  
  
 <dependencies>  
  
  <dependency>  
  <groupId>com.minimalism</groupId>  
 <artifactId>framework-knife4j</artifactId>  
 <version>${project-module-ai.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>com.minimalism</groupId>  
 <artifactId>framework-langchain4j</artifactId>  
 <version>${project-module.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>dev.langchain4j</groupId>  
 <artifactId>langchain4j-community-dashscope</artifactId>  
 <version>${langchain4j.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>dev.langchain4j</groupId>  
 <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>  
 <version>${langchain4j.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>dev.langchain4j</groupId>  
 <artifactId>langchain4j-ollama-spring-boot-starter</artifactId>  
 <version>${langchain4j.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>dev.langchain4j</groupId>  
 <artifactId>langchain4j-web-search-engine-searchapi</artifactId>  
 <version>${langchain4j.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>dev.langchain4j</groupId>  
 <artifactId>langchain4j-easy-rag</artifactId>  
 <version>${langchain4j.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>dev.langchain4j</groupId>  
 <artifactId>langchain4j-pgvector</artifactId>  
 <version>${langchain4j.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-starter</artifactId>  
  </dependency>  
  
 <dependency>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-starter-web</artifactId>  
  </dependency>  
  
 <dependency>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-starter-test</artifactId>  
 <scope>test</scope>  
  </dependency>  
  </dependencies>  
 
</project>

以上为演示的3层父子pom

application.yml

spring:  
  profiles:  
    active: @spring.profiles.active@
    #@spring.profiles.active@==>占位符
    #必须与以下定义的值一致 如properties下有 <xxx.a>test</xxx.a>其占位符为 @xxx.a@ xxx.a为自定义
    #<properties>
    #<spring.profiles.active>test</spring.profiles.active>
    #</properties>

效果图如下

M_Snipaste_2025-02-28_11-30-32.jpg

演示视频

特点: parent 直接在最父级继承pring-boot-starter-parent 统一了springboot版本同时也限制了springboot版本不可在micro-service下的模块中使用不同的springboot版本 耦合性极高

2.pom 使用 结构2 dependencyManagement 方案

minimalism  
├─common-base-all  
│  ├─common-base  
│  ├─common-base-aop  
│  └─common-code  
├─common-dao-module-all  
│  ├─dao-all  
│  ├─dao-gen-module  
│  ├─dao-im-module  
│  └─dao-user-module  
├─common-framework-all  
│  ├─framework-dynamic-datasource  
│  ├─framework-easy-elasticsearch  
│  ├─framework-elasticsearch  
│  ├─framework-jpa  
│  ├─framework-knife4j  
│  ├─framework-mybatis-plus  
│  ├─framework-nacos  
│  ├─framework-rabbitmq  
│  ├─framework-redis  
│  ├─framework-seata  
│  ├─framework-sharding-sphere  
│  └─framework-weixin-java  
├─common-module-all  
│  ├─common-openfeign-module  
│  ├─common-security-module  
│  └─common-shiro-module  
├─common-service-module-all  
│  ├─gen-service-module  
│  ├─im-service-module  
│  ├─user-service-module  
│  ├─validate-code-service-module  
│  └─websocket-service-module  
├─micro-service-module-all  
│  ├─gateway  
│  ├─gen  
│  ├─im  
│  ├─task  
│  │  ├─quartz  
│  │  └─xxl-job  
│  ├─user  
│  └─websocket  
└─sql

minimalism pom

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  
 <groupId>com.minimalism</groupId>  
 <artifactId>minimalism</artifactId>  
 <version>${project-module.version}</version>  
 <packaging>pom</packaging>  
  
 <properties>  
  <java.version>1.8</java.version>  
 <project-module.version>0.0.1-SNAPSHOT</project-module.version>  
 <project.Encoding>UTF-8</project.Encoding>  
  
 <maven.compiler.source>${java.version}</maven.compiler.source>  
 <maven.compiler.target>${java.version}</maven.compiler.target>  
  
 <project.build.sourceEncoding>${project.Encoding}</project.build.sourceEncoding>  
 <project.reporting.outputEncoding>${project.Encoding}</project.reporting.outputEncoding>  
  </properties>  
  
 <modules>  
  <module>common-base-all</module>  
 <module>common-framework-all</module>  
 <module>common-module-all</module>  
 <module>common-dao-module-all</module>  
 <module>common-service-module-all</module>  
 <module>micro-service-module-all</module>  
  </modules>  
  
  <!--远程仓库-->  
  <repositories>  
  <repository>  
  <id>aliyun-public</id>  
 <url>https://maven.aliyun.com/nexus/content/groups/public/</url>  
  </repository>  
  
 <repository>  
  <id>aliyun</id>  
 <url>https://maven.aliyun.com/repository/public</url>  
 <releases>  
  <enabled>true</enabled>  
  </releases>  
 <snapshots>  
  <enabled>false</enabled>  
  </snapshots>  
  </repository>  
  </repositories>  
  
 <pluginRepositories>  
  <pluginRepository>  
  <id>aliyun-plugin</id>  
 <url>https://maven.aliyun.com/repository/public</url>  
 <releases>  
  <enabled>true</enabled>  
  </releases>  
 <snapshots>  
  <enabled>false</enabled>  
  </snapshots>  
  </pluginRepository>  
  </pluginRepositories>  
  
  
 <profiles>  
  <profile>  
  <id>test</id>  
 <properties>  
  <spring.profiles.active>test</spring.profiles.active>  
  </properties>  
 <activation>  
  <activeByDefault>true</activeByDefault>  
  </activation>  
  </profile>  
 <profile>  
  <id>dev</id>  
 <properties>  
  <spring.profiles.active>dev</spring.profiles.active>  
  </properties>  
  </profile>  
 <profile>  
  <id>prod</id>  
 <properties>  
  <spring.profiles.active>prod</spring.profiles.active>  
  </properties>  
  </profile>  
  </profiles>  
</project>

micro-service-module-all pom

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
 <parent>  
  <groupId>com.minimalism</groupId>  
 <artifactId>minimalism</artifactId>  
 <version>0.0.1-SNAPSHOT</version>  
  </parent>  
  
 <artifactId>micro-service-module-all</artifactId>  
 <packaging>pom</packaging>  
  
 <properties>  
  <spring-cloud.version>2021.0.5</spring-cloud.version>  
 <alibaba-cloud.version>2021.0.5.0</alibaba-cloud.version>  
 <spring-boot.version>2.7.18</spring-boot.version>  
  </properties>  
  
 <modules>  
  <module>gateway</module>  
 <module>gen</module>  
 <module>im</module>  
 <module>websocket</module>  
 <module>task</module>  
 <module>user</module>  
  </modules>  
  
 <dependencyManagement>  
  <dependencies>  
  <!-- Spring-Boot Version BOM -->  
  <dependency>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-dependencies</artifactId>  
 <version>${spring-boot.version}</version>  
 <scope>import</scope>  
 <type>pom</type>  
  </dependency>  
  </dependencies>  
  </dependencyManagement>  
  
 <build>  
  <resources>  
  <resource>  
  <directory>src/main/resources</directory>  
 <includes>  
  <include>**/*</include>  
  </includes>  
 <filtering>true</filtering>  
  </resource>  
  </resources>  
  
 <plugins>  
  <plugin>  
  <groupId>org.apache.maven.plugins</groupId>  
 <artifactId>maven-compiler-plugin</artifactId>  
 <version>3.8.1</version>  
 <configuration>  
  <source>${java.version}</source>  
 <target>${java.version}</target>  
 <encoding>${project.Encoding}</encoding>  
  </configuration>  
  </plugin>  
 <plugin>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-maven-plugin</artifactId>  
  </plugin>  
  </plugins>  
  </build>  
  
</project>

websocket pom

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
 <parent>  
  <groupId>com.minimalism</groupId>  
 <artifactId>micro-service-module-all</artifactId>  
 <version>0.0.1-SNAPSHOT</version>  
  </parent>  
  
 <artifactId>websocket</artifactId>  
  
 <properties>  
  <spring-cloud.version>2021.0.5</spring-cloud.version>  
 <alibaba-cloud.version>2021.0.5.0</alibaba-cloud.version>  
 <spring-boot.version>2.7.9</spring-boot.version>  
  
 <hutool.version>5.8.20</hutool.version>  
 <fastjson.version>2.0.32</fastjson.version>  
 <logstash.version>5.3</logstash.version>  
  </properties>  
  
 <dependencyManagement>  
  <dependencies>  
  <!-- Spring Cloud Version BOM -->  
  <dependency>  
  <groupId>org.springframework.cloud</groupId>  
 <artifactId>spring-cloud-dependencies</artifactId>  
 <version>${spring-cloud.version}</version>  
 <type>pom</type>  
 <scope>import</scope>  
  </dependency>  
 <dependency>  
  <groupId>com.alibaba.cloud</groupId>  
 <artifactId>spring-cloud-alibaba-dependencies</artifactId>  
 <version>${alibaba-cloud.version}</version>  
 <type>pom</type>  
 <scope>import</scope>  
  </dependency>  
  </dependencies>  
  </dependencyManagement>  
  
 <dependencies>  
  <dependency>  
  <groupId>com.minimalism</groupId>  
 <artifactId>websocket-service-module</artifactId>  
 <version>${project-module.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>com.minimalism</groupId>  
 <artifactId>framework-knife4j</artifactId>  
 <version>${project-module.version}</version>  
  </dependency>  
  
 <dependency>  
  <groupId>org.springframework.boot</groupId>  
 <artifactId>spring-boot-starter-test</artifactId>  
 <scope>test</scope>  
  </dependency>  
  </dependencies>  
</project>

bootstrap.yml

spring:
  application:
    name: websocket

  profiles:
    active: @spring.profiles.active@

  main:
   allow-circular-references: true

  jackson:
    serialization:
      FAIL_ON_EMPTY_BEANS: false

  cloud:
    nacos:
      discovery:
        service: ${spring.application.name}
        server-addr: ${nacos.server-addr}
        username: ${nacos.username}
        password: ${nacos.username}
      config:
        server-addr: ${nacos.server-addr}
        username: ${nacos.username}
        password: ${nacos.username}
        refresh-enabled: true
        refreshable-dataids: ${spring.cloud.nacos.discovery.service:${spring.application.name}}-${spring.profiles.active:test}.${spring.cloud.nacos.config.file-extension:yaml}

server:
  port: 18900
  servlet:
    context-path: /${spring.application.name}
############################################自定义############################################
nacos:
  server-addr: 127.0.0.1:8848
  username: nacos
  password: nacos

logstash:
  addr: 127.0.0.1:4560
  file: var/log/${spring.application.name}/${spring.profiles.active}/${spring.application.name}.log
  fileNamePattern: var/log/${spring.application.name}/${spring.profiles.active}/${spring.application.name}-logstash.%d{yyyy-MM-dd}.log
  maxHistory: 30
  totalSizeCap: 10MB

以上为本次演示的3层父子pom

效果图如下

maven-02.jpg

演示视频

特点:采用 dependencyManagement 方案管理 可以统一springboot版本同时也可以在micro-service-module-all下的模块中使用不同的springboot版本 真正实现了 高内聚,低耦合

报错问题解决

如果你出现以下错误说明占位符无法识别
maven reader.jpg
解决方案:
在你的结构中pom或父结构中pom(在父结构中加入其他子结构无需在加入了)加入以下配置

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>