-
在 Maven 项目中,.mvn/maven.conf 是一个可选的配置文件,通常用于覆盖 Maven 的默认行为或提供项目级别的全局配置。如果你在 IDE(如 IntelliJ IDEA)或命令行中勾选了 “Use settings from .mvn/maven.conf”,Maven 会优先读取该文件中的配置,而不是仅依赖全局的 settings.xml 或命令行参数。1. .mvn/maven.conf 的作用.mvn/maven.conf 文件通常包含以下类型的配置:Maven 运行时参数(如 JVM 选项、内存设置)全局属性(-Dproperty=value)Maven 插件配置(如 maven-surefire-plugin 的默认配置)仓库镜像或代理设置(部分情况下可替代 settings.xml)示例 .mvn/maven.conf 内容# JVM 参数 MAVEN_OPTS=-Xms512m -Xmx1024m -Dfile.encoding=UTF-8 # 全局属性 -Dmaven.test.skip=true -Dproject.build.sourceEncoding=UTF-8 # Maven 插件配置(可选) # -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn2. 勾选 “Use settings from .mvn/maven.conf” 的作用当你在 IntelliJ IDEA 或 Maven 命令行 中勾选此选项时:Maven 会优先读取 .mvn/maven.conf 中的配置,而不是仅依赖:全局 settings.xml(~/.m2/settings.xml)项目 pom.xml命令行参数(如 -Dmaven.test.skip=true)适用于多模块项目,可以统一管理所有子模块的 Maven 配置。避免重复配置,例如 JVM 内存、编码、测试跳过等常见参数。3. 常见使用场景(1) 统一 JVM 参数如果项目需要更大的内存或特定的编码,可以在 .mvn/maven.conf 中设置:MAVEN_OPTS=-Xms1024m -Xmx2048m -Dfile.encoding=UTF-8 这样,所有模块在构建时都会自动使用这些参数,无需手动指定。(2) 跳过测试如果项目在开发阶段不需要运行测试,可以全局禁用:-Dmaven.test.skip=true (比在 pom.xml 中配置 maven-surefire-plugin 更灵活)(3) 强制使用特定 Maven 版本如果项目依赖特定 Maven 版本,可以指定:-Dmaven.version=3.9.0 (4) 替代 settings.xml 的部分功能虽然 .mvn/maven.conf 不能完全替代 settings.xml(如仓库认证),但可以设置一些全局属性,例如:-Dmaven.repo.local=/path/to/custom/repo4. 与 settings.xml 的区别配置文件作用范围主要用途是否支持认证.mvn/maven.conf项目级JVM 参数、全局属性、插件配置❌ 不支持settings.xml用户级/全局仓库镜像、代理、认证✅ 支持pom.xml项目级依赖、插件、构建配置❌ 不支持.mvn/maven.conf 适合轻量级配置,而 settings.xml 适合管理仓库、认证等敏感信息。如果两者冲突,settings.xml 通常会覆盖 .mvn/maven.conf(取决于具体参数)。5. 如何在 IntelliJ IDEA 中使用?确保项目根目录有 .mvn/maven.conf(如果没有,可以手动创建)。在 Maven 运行配置中勾选:Run/Debug Configurations → Maven → 勾选 “Use settings from .mvn/maven.conf”。运行 Maven 命令时,会自动加载 .mvn/maven.conf 中的配置。6. 总结✅ 优点⚠ 注意事项统一管理项目级 Maven 配置不能替代 settings.xml 的认证功能避免重复配置 JVM 参数、测试跳过等配置优先级可能因 Maven 版本而异适用于多模块项目部分参数可能被命令行覆盖推荐使用场景:需要统一 JVM 内存、编码、测试跳过等配置。希望避免在每个模块的 pom.xml 中重复配置。开发环境需要覆盖某些默认 Maven 行为。不推荐使用场景:需要管理仓库认证(仍需 settings.xml)。需要极细粒度的配置(如单个模块的特殊参数)。如果你只是需要简单的全局配置,.mvn/maven.conf 是一个方便的选择! 🚀
-
在 IntelliJ IDEA 的 Maven 插件中,Lifecycle(生命周期) 是 Maven 构建项目的核心流程,它由一系列有序的阶段(Phase)组成。每个阶段代表一个特定的构建步骤,执行时会按顺序运行该阶段及其之前的所有阶段。以下是 Maven 标准生命周期中常见阶段的详细说明:1. 生命周期阶段分类Maven 的生命周期分为 三套独立流程,每套流程包含不同的阶段:Clean Lifecycle(清理流程)用于清理项目生成的临时文件和输出目录(如 target/)。Default Lifecycle(默认流程)核心构建流程,涵盖编译、测试、打包、安装等步骤。Site Lifecycle(站点流程)生成项目文档和报告(如 API 文档、测试报告等)。2. 各阶段详细说明Clean Lifecycle(清理流程)阶段作用pre-clean清理前的预处理(极少使用)。clean删除 target/ 目录(包括编译生成的类文件、打包的 JAR/WAR 等)。post-clean清理后的收尾工作(极少使用)。示例命令:mvn clean # 仅执行清理 Default Lifecycle(默认流程)阶段作用validate验证项目配置是否正确(如检查 pom.xml 依赖是否有效)。compile编译项目的主源代码(src/main/java)到 target/classes/。test编译并运行单元测试(src/test/java),测试代码不会打包到最终产物中。package将编译后的代码打包成可分发格式(如 JAR、WAR),存放到 target/。verify运行集成测试或检查包的有效性(如通过 maven-surefire-plugin 验证)。install将包安装到本地 Maven 仓库(~/.m2/repository/),供其他项目依赖。deploy将包发布到远程仓库(如 Nexus、Artifactory),供团队共享。关键点:执行 package 时,会先执行 validate → compile → test → verify。install 和 deploy 会将包上传到仓库,但 install 是本地仓库,deploy 是远程仓库。示例命令:mvn compile # 仅编译主代码 mvn test # 编译并运行测试 mvn package # 编译、测试、打包 mvn install # 编译、测试、打包、安装到本地仓库 mvn deploy # 编译、测试、打包、发布到远程仓库 Site Lifecycle(站点流程)阶段作用pre-site生成站点前的预处理(极少使用)。site生成项目文档站点(HTML 格式),存放到 target/site/。post-site站点生成后的收尾工作(如压缩文档)。site-deploy将生成的站点部署到服务器(如通过 FTP 或 SSH 上传)。示例命令:mvn site # 生成项目文档 mvn site-deploy # 部署文档到服务器 3. 常见问题解答Q1:为什么执行 mvn package 时会自动运行测试?Maven 生命周期是阶段串联的,执行 package 会隐式触发其之前的所有阶段(包括 test)。如果需要跳过测试,可添加参数:mvn package -DskipTests # 跳过测试编译和运行 mvn package -Dmaven.test.skip=true # 完全跳过测试相关操作(更快) Q2:install 和 deploy 的区别?install:将包上传到本地仓库(~/.m2/repository/),仅当前机器可用。deploy:将包上传到远程仓库(如公司 Nexus 或 Maven Central),供团队其他成员下载。Q3:如何自定义生命周期行为?通过 Maven 插件(Plugin) 绑定到特定阶段。例如:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <executions> <execution> <phase>test</phase> <!-- 绑定到 test 阶段 --> <goals> <goal>test</goal> </goals> </execution> </executions> </plugin> 4. 总结图示Clean Lifecycle: pre-clean → clean → post-clean Default Lifecycle: validate → compile → test → package → verify → install → deploy Site Lifecycle: pre-site → site → post-site → site-deploy操作建议:在 IDEA 中右键点击 Maven 项目的 Lifecycle 节点,选择对应阶段即可执行。复杂构建可通过 mvn <phase1> <phase2> 组合命令(如 mvn clean install)。通过理解这些阶段,你可以更灵活地控制 Maven 的构建流程!
-
在idea上构建含有自己依赖从父依赖继承自己依赖的项目是不会报错能正常编译的,希望能参考idea尽量减少开发者处理的错误,这种错误明显不符合常理按正常逻辑重复的依赖应该能自动剔除。
-
<?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>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba</artifactId> <version>2023.0.1.2</version> <relativePath/> </parent> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-backend</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>intelligent-teaching-commons</module> <module>intelligent-teaching-user</module> <module>intelligent-teaching-chat</module> <module>intelligent-teaching-exam</module> <module>intelligent-teaching-chat/intelligent-teaching-chat-api</module> <module>intelligent-teaching-chat/intelligent-teaching-chat-shared</module> <module>intelligent-teaching-exam/intelligent-teaching-exam-api</module> <module>intelligent-teaching-exam/intelligent-teaching-exam-shared</module> <module>intelligent-teaching-oss</module> <module>intelligent-teaching-job</module> <module>intelligent-teaching-search</module> <module>intelligent-teaching-ai</module> </modules> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-ai.version>1.0.3</spring-ai.version> </properties> <repositories> <repository> <id>aliyunmaven</id> <url>https://maven.aliyun.com/repository/public</url> </repository> </repositories> <dependencies> <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-commons</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.2.4</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2023.0.1.2</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2023.0.1</version> <type>pom</type> <scope>import</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.34</version> <scope>compile</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.9</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-annotation</artifactId> <version>3.5.9</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>1.2.23</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.6.0</version> </dependency> <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.33</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.5.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.17.0</version> </dependency> <!-- https://mvnrepository.com/artifact/io.minio/minio --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.13</version> </dependency> <!-- https://mvnrepository.com/artifact/io.netty/netty-all --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.115.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.43.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.4.2</version> </dependency> <!-- https://mvnrepository.com/artifact/co.elastic.clients/elasticsearch-java --> <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.17.1</version> </dependency> <dependency> <groupId>com.luhuiguo</groupId> <artifactId>aspose-words</artifactId> <version>23.1</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>3.0.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-core --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-core</artifactId> <version>9.1.0</version> <type>pom</type> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.12.1</version> </dependency> <dependency> <groupId>io.springboot.ai</groupId> <artifactId>spring-ai-core</artifactId> <version>${spring-ai.version}</version> </dependency> <dependency> <groupId>io.springboot.ai</groupId> <artifactId>spring-ai-ollama</artifactId> <version>${spring-ai.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.32.0</version> </dependency> <!-- https://mvnrepository.com/artifact/io.milvus/milvus-sdk-java --> <dependency> <groupId>io.milvus</groupId> <artifactId>milvus-sdk-java</artifactId> <version>2.5.10</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-oss</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-job</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-search</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-ai</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-chat-shared</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-exam-shared</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.cat</groupId> <artifactId>intelligent-teaching-user-shared</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.9</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.4</version> </dependency> </dependencies> </dependencyManagement> </project>
-
当Profile管理遇上复杂场景在持续交付与多环境部署成为标配的现代软件开发中,Maven Profile作为构建环境隔离的核心机制,承载着至关重要的配置管理职责。据统计,超过78%的中大型Java项目使用超过5个Profile进行环境配置管理。但当项目复杂度达到一定规模时,Profile之间的隐形依赖、条件激活冲突、配置覆盖异常等问题将频繁显现,某知名电商平台曾因Profile配置错误导致生产环境加载测试数据库,造成数百万损失。这些血淋淋的教训暴露出Profile管理中的三大痛点:多条件组合的不可预测性、特性开关的版本耦合风险、配置合并规则的认知盲区。本文将深入解析Profile的底层工作机制,通过四维解剖(组合激活策略、特性开关实现、配置合并规则、隐式冲突排查)构建完整的Profile治理体系,提供可直接落地的工程化解决方案。一、Profile组合激活的布尔逻辑1.1 基础激活条件深度解构Maven支持6种标准激活条件,其实现类位于maven-model-builder模块的ProfileActivator接口:1234public interface ProfileActivator { boolean isActive(Profile profile, ProfileActivationContext context) throws ProfileActivationException;}各条件类型在maven-model的Profile定义中体现:123456789101112131415161718192021222324252627<profile> <activation> <!-- JDK版本条件 --> <jdk>1.8</jdk> <!-- 操作系统条件 --> <os> <name>Windows 10</name> <family>Windows</family> <arch>amd64</arch> <version>10.0</version> </os> <!-- 属性存在性检查 --> <property> <name>debug</name> </property> <!-- 属性值匹配 --> <property> <name>env</name> <value>prod</value> </property> <!-- 文件存在性检查 --> <file> <exists>${basedir}/.env</exists> <missing>${basedir}/.ci</missing> </file> </activation></profile>1.2 逻辑与(AND)的三种实现范式范式1:单Profile多条件隐式AND123456789<activation> <property> <name>env</name> <value>prod</value> </property> <os> <family>Linux</family> </os></activation>此时env=prod与Linux系统需同时满足(源码见org.apache.maven.model.profile.DefaultProfileActivationContext#isActive)范式2:多Profile级联激活12345678910111213141516171819202122<profile> <id>profileA</id> <activation> <property> <name>cluster</name> </property> </activation></profile> <profile> <id>profileB</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>core</artifactId> <version>${revision}</version> </dependency> </dependencies></profile>通过命令行mvn -P profileA -P profileB显式激活实现AND逻辑范式3:伪条件表达式123456<activation> <property> <name>complex.condition</name> <value>true</value> </property></activation>结合properties-maven-plugin前置生成复合条件值1.3 逻辑或(OR)的工程化实现方案1:多Profile镜像配置1234567891011121314151617<profile> <id>profileX</id> <activation> <jdk>[1.8,)</jdk> </activation> <!-- 公共配置 --></profile> <profile> <id>profileY</id> <activation> <property> <name>forceJdk</name> </property> </activation> <!-- 相同配置 --></profile>通过mvn -P profileX,profileY实现OR语义方案2:Shell条件预处理12345#!/bin/bashif [[ "$JDK_VERSION" > "1.8" ]] || [[ "$ENV" == "prod" ]]; then PROFILES="high_version,production"fimvn clean install -P $PROFILES方案3:属性表达式解析123456789101112<properties> <activation.condition>${env:ENV:-dev}</activation.condition></properties> <profile> <activation> <property> <name>activation.condition</name> <value>prod|staging</value> </property> </activation></profile>通过正则表达式实现值域匹配二、基于Profile的精准特性开关设计2.1 特性开关的三层实现模型层级实现方式示例生效阶段构建时Maven属性<enable.cache>true</enable.cache>资源过滤阶段运行时Spring Profile@Profile("redis")应用启动时混合式条件化依赖<scope>${cache.scope}</scope>依赖解析阶段2.2 构建时开关的精准控制动态资源过滤1234567891011121314<profile> <id>cdn</id> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> <properties> <static.resource.url>https://cdn.example.com</static.resource.url> </properties></profile>在application.properties中:1web.static-path=${static.resource.url}/assets条件化依赖树123456789101112131415161718192021<profile> <id>mysql</id> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> </dependencies></profile> <profile> <id>postgresql</id> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.3</version> </dependency> </dependencies></profile>通过mvn -P mysql或mvn -P postgresql切换数据库驱动2.3 运行时开关的优雅降级Spring Boot集成方案12345678@Configuration@ConditionalOnProperty(name = "feature.cache.enabled", havingValue = "true")public class CacheAutoConfiguration { @Bean public CacheManager redisCacheManager(RedisConnectionFactory factory) { return RedisCacheManager.create(factory); }}对应Profile配置:123456<profile> <id>redis-cache</id> <properties> <feature.cache.enabled>true</feature.cache.enabled> </properties></profile>2.4 开关的版本控制策略在pom.xml中定义版本矩阵:12345678910111213<properties> <featureA.version>2.1.0</featureA.version> <featureB.version>1.4.3</featureB.version></properties> <profiles> <profile> <id>feature-rollback</id> <properties> <featureA.version>2.0.4</featureA.version> </properties> </profile></profiles>通过版本回退实现灰度发布三、Profile配置合并的原子化规则3.1 Maven元素合并策略矩阵元素类型合并策略示例说明dependencies追加合并多Profile依赖累加plugins按groupId和artifactId合并相同插件配置合并resources目录追加多资源目录叠加properties最后写入优先后激活Profile覆盖前者repositories追加合并仓库列表扩展pluginRepositories追加合并插件仓库扩展3.2 列表型元素的合并深度依赖合并示例:1234567891011121314151617181920212223242526<!-- Base POM --><dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.18</version> </dependency></dependencies> <!-- Profile A --><dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency></dependencies> <!-- Profile B --><dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.20</version> </dependency></dependencies>激活A和B后的依赖列表:spring-core:5.3.20(B覆盖基础版本)jackson-databind:2.13.33.3 插件配置的合并策略合并优先级:命令行参数子POM配置父POM配置Profile配置(按激活顺序倒序)1234567891011121314151617181920212223242526<!-- Profile X --><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins></build> <!-- Profile Y --><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <release>11</release> </configuration> </plugin> </plugins></build>同时激活X和Y时,最终配置为:12345<configuration> <source>1.8</source> <target>1.8</target> <release>11</release></configuration>导致构建失败,因为source/target与release参数互斥四、隐式覆盖的立体化排查体系4.1 诊断工具矩阵工具功能定位使用示例mvn help:active-profiles显示激活Profile列表mvn help:active-profiles -P prodmvn help:effective-pom查看最终合并POMmvn help:effective-pom -Doutput=effective.xmlmvn dependency:tree分析依赖树冲突mvn dependency:tree -Dverbosemvn -X启用调试日志mvn -X clean installmvn help:effective-settings查看合并后的settingsmvn help:effective-settings4.2 典型冲突场景分析场景1:属性覆盖暗战12345678910111213141516171819<!-- settings.xml --><profiles> <profile> <id>global</id> <properties> <app.version>1.0.0</app.version> </properties> </profile></profiles> <!-- pom.xml --><profiles> <profile> <id>local</id> <properties> <app.version>2.0.0-SNAPSHOT</app.version> </properties> </profile></profiles>激活顺序决定最终值:mvn -P global,local → 2.0.0-SNAPSHOTmvn -P local,global → 1.0.0场景2:资源目录黑洞12345678910<profile> <id>override-resources</id> <build> <resources> <resource> <directory>src/main/resources-override</directory> </resource> </resources> </build></profile>原resources配置被完全覆盖而非追加,需显式包含原目录:12345678<resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/resources-override</directory> </resource></resources>4.3 高级调试技巧断点调试法:在maven-core的DefaultMaven.java中设置断点:12345public class DefaultMaven implements Maven { private List<Profile> getActiveProfiles(...) { // 此处分析Profile激活逻辑 }}构建过程追踪:12mvn clean install -l build.log -e -Xgrep "Activating profile" build.log
-
smproxy-1.0.1.jar maven依赖镜像在哪里能下载到?哪位开发指导一下
-
在开发过程中,有时候会遇到需要将本地的 JAR 包安装到 Maven 仓库的情况,比如使用一些没有在公共 Maven 仓库中的第三方库。下面为你介绍几种不同场景下将 JAR 包安装到 Maven 仓库的方法。基础命令安装可以使用 mvn install:install-file 命令把 JAR 包安装到本地 Maven 仓库,以下是具体命令示例:mvn install:install-file -Dfile=path/to/your.jar -DgroupId=com.yourcompany -DartifactId=your-artifact -Dversion=1.0 -Dpackaging=jar参数说明:-Dfile:指定 JAR 包的本地路径。-DgroupId:定义 JAR 包的组织或公司名称,一般使用反向域名。-DartifactId:代表项目或模块的名称。-Dversion:表示 JAR 包的版本号。-Dpackaging:指定打包类型,通常为 jar。示例假设你有一个名为 example.jar 的 JAR 包,需要将其安装到本地 Maven 仓库,对应的 groupId 为 com.example,artifactId 为 example-library,版本号为 1.0,可以使用以下命令:mvn install:install-file -Dfile=example.jar -DgroupId=com.example -DartifactId=example-library -Dversion=1.0 -Dpackaging=jar运行上述命令之后,Maven 就会把 JAR 包安装到本地仓库对应的目录下。在项目的 pom.xml 里引用已安装的 JAR 包当 JAR 包安装到本地 Maven 仓库之后,你可以在项目的 pom.xml 文件里引用该 JAR 包,示例如下:xml<dependencies> <dependency> <groupId>com.example</groupId> <artifactId>example-library</artifactId> <version>1.0</version> </dependency> </dependencies>安装带有依赖的 JAR 包要是 JAR 包有依赖项,你需要确保所有依赖项也被正确安装到本地 Maven 仓库。可以通过以下步骤操作:把依赖的 JAR 包也安装到本地 Maven 仓库,使用 mvn install:install-file 命令逐个安装。在 pom.xml 文件里添加所有依赖项的声明。安装带有 POM 文件的 JAR 包若 JAR 包附带了 POM 文件,可使用以下命令安装:mvn install:install-file -Dfile=path/to/your.jar -DpomFile=path/to/your.pom 此命令会依据 POM 文件里的配置安装 JAR 包及其依赖项。通过上述步骤,你就可以把 JAR 包安装到 Maven 仓库,并且在项目里引用它。
-
在 Maven 的 settings.xml 文件中,你可以配置多个镜像和仓库来实现你的需求。以下是一个示例配置,展示了如何从局域网内部服务器开始查找依赖,如果没找到再从阿里云仓库查找,如果仍然没找到,则回退到 Maven 官方仓库。<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!-- 配置本地仓库位置(可选) --> <localRepository>/path/to/local/repo</localRepository> <mirrors> <!-- 配置局域网内部仓库 --> <mirror> <id>internal-repo</id> <mirrorOf>*</mirrorOf> <url>http://your-internal-repo-url/repository/maven-public/</url> <blocked>false</blocked> </mirror> <!-- 配置阿里云仓库 --> <mirror> <id>aliyun-repo</id> <mirrorOf>external:*</mirrorOf> <url>https://maven.aliyun.com/repository/public</url> <blocked>false</blocked> </mirror> <!-- 注意:官方仓库不需要配置为镜像,因为它是默认行为 --> </mirrors> <profiles> <!-- 你可以在这里配置一些 profiles,不过对于这个问题来说不是必须的 --> </profiles> <activeProfiles> <!-- 同样,对于这个问题来说,不需要激活特定的 profile --> </activeProfiles> <!-- 关键部分:配置仓库顺序 --> <servers> <!-- 配置认证信息(如果需要的话) --> <!-- 局域网内部仓库认证信息 --> <server> <id>internal-repo</id> <username>your-internal-repo-username</username> <password>your-internal-repo-password</password> </server> <!-- 阿里云仓库认证信息(如果需要的话) --> <!-- <server> <id>aliyun-repo</id> <username>your-aliyun-repo-username</username> <password>your-aliyun-repo-password</password> </server> --> </servers> <!-- 注意:这里没有显式配置官方仓库,因为 Maven 默认会从官方仓库下载 --> </settings> 解释:镜像配置 (<mirrors>):internal-repo:首先尝试从局域网内部仓库下载依赖。aliyun-repo:如果局域网内部仓库找不到依赖,Maven 会尝试从阿里云仓库下载。这里使用了 mirrorOf 的 external:* 匹配模式,意味着它只替代官方仓库和外部仓库。服务器认证 (<servers>):配置了局域网内部仓库的认证信息。如果阿里云仓库需要认证,也可以在这里添加相应的配置。默认行为:Maven 默认会从 Maven 中央仓库(官方仓库)下载依赖。由于我们配置了 mirrorOf=* 的镜像,它会优先查找这些镜像。如果镜像中都没有找到,Maven 会回退到官方仓库。注意事项:mirrorOf 属性用于指定哪些仓库(或所有仓库)被镜像替代。* 表示所有仓库,external:* 表示除了本地仓库以外的所有仓库。确保你配置的 URL 和认证信息是有效的。这个配置假设你的局域网内部仓库和阿里云仓库已经正确设置,并且可以访问。
-
maven 访问返回 418
-
https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/下的相关文件无法正常下载了。提示:418您的请求疑似攻击行为?????
-
一、依赖冲突产生的原因 调用的某个A包依赖于B包,B又依赖于C 和D 但是C依赖于E的1.0版本,D依赖于E的2.0版本 1.0跟2.0冲突了。 常见解决办法:直接使用2.0版本,删除1.0的依赖 原因:正常开源是向下依赖的,也就是说新版本都是包含老版本内容的。所以一般都可以直接使用2.0,这样1.0的依赖就需要我们手工把他干掉,这样就不冲突啦 二、CDM命令行: 2.1查看依赖树 进入到项目路径,输入依赖树命令 E:\Develop\eclipse\workspace\oa-organ>mvn dependency:tree 返回如下: ... Downloaded from aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/shared/maven-invoker/2.0.11/maven-invoker-2.0.11.jar (29 kB at 12 kB/s) Downloaded from aliyun: http://maven.aliyun.com/nexus/content/groups/public/commons-lang/commons-lang/2.6/commons-lang-2.6.jar (284 kB at 115 kB/s) [INFO] com.xxxx.oa:oa-organ:jar:1.0.0-SNAPSHOT [INFO] +- org.springframework:spring-core:jar:3.2.8.RELEASE:compile [INFO] | \- commons-logging:commons-logging:jar:1.1.3:compile [INFO] +- org.springframework:spring-webmvc:jar:3.2.8.RELEASE:compile [INFO] | +- org.springframework:spring-beans:jar:3.2.8.RELEASE:compile [INFO] | \- org.springframework:spring-expression:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-context:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-context-support:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-aop:jar:3.2.8.RELEASE:compile [INFO] | \- aopalliance:aopalliance:jar:1.0:compile [INFO] +- org.springframework:spring-aspects:jar:3.2.8.RELEASE:compile [INFO] | \- org.aspectj:aspectjweaver:jar:1.7.4:compile [INFO] +- org.springframework:spring-tx:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-jdbc:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-web:jar:3.2.8.RELEASE:compile [INFO] +- junit:junit:jar:4.13.2:test [INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] +- org.springframework:spring-test:jar:3.2.8.RELEASE:test [INFO] +- log4j:log4j:jar:1.2.12:compile [INFO] +- org.slf4j:slf4j-api:jar:1.6.6:compile [INFO] +- org.slf4j:slf4j-log4j12:jar:1.6.6:compile [INFO] +- org.mybatis:mybatis:jar:3.2.1:compile [INFO] +- org.mybatis:mybatis-spring:jar:1.2.0:compile [INFO] \- mysql:mysql-connector-java:jar:5.1.47:compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 39.332 s [INFO] Finished at: 2021-11-27T23:06:45+08:00 [INFO] ------------------------------------------------------------------------ 2.2 修改项目中的pom.xml文件 在原有的依赖dependency中增加如下 下面<exclusions></exclusions>中间这一段是新增的 <!-- spring依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.8.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> 2.3再次查看依赖树 E:\Develop\eclipse\workspace\oa-organ>mvn dependency:tree 返回如下 [INFO] Scanning for projects... [INFO] [INFO] ------------------------< com.xxxx.oa:oa-organ >------------------------ [INFO] Building oa-organ 1.0.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ oa-organ --- [WARNING] The artifact xml-apis:xml-apis:jar:2.0.2 has been relocated to xml-apis:xml-apis:jar:1.0.b2 [INFO] com.xxxx.oa:oa-organ:jar:1.0.0-SNAPSHOT [INFO] +- org.springframework:spring-core:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-webmvc:jar:3.2.8.RELEASE:compile [INFO] | +- org.springframework:spring-beans:jar:3.2.8.RELEASE:compile [INFO] | \- org.springframework:spring-expression:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-context:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-context-support:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-aop:jar:3.2.8.RELEASE:compile [INFO] | \- aopalliance:aopalliance:jar:1.0:compile [INFO] +- org.springframework:spring-aspects:jar:3.2.8.RELEASE:compile [INFO] | \- org.aspectj:aspectjweaver:jar:1.7.4:compile [INFO] +- org.springframework:spring-tx:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-jdbc:jar:3.2.8.RELEASE:compile [INFO] +- org.springframework:spring-web:jar:3.2.8.RELEASE:compile [INFO] +- junit:junit:jar:4.13.2:test [INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] +- org.springframework:spring-test:jar:3.2.8.RELEASE:test [INFO] +- log4j:log4j:jar:1.2.12:compile [INFO] +- org.slf4j:slf4j-api:jar:1.6.6:compile [INFO] +- org.slf4j:slf4j-log4j12:jar:1.6.6:compile [INFO] +- org.mybatis:mybatis:jar:3.2.1:compile [INFO] +- org.mybatis:mybatis-spring:jar:1.2.0:compile [INFO] \- mysql:mysql-connector-java:jar:5.1.47:compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.938 s [INFO] Finished at: 2021-11-27T23:36:43+08:00 [INFO] ------------------------------------------------------------------------ 与上面对比 [INFO] +- org.springframework:spring-core:jar:3.2.8.RELEASE:compile 下面的这一行 [INFO] | \- commons-logging:commons-logging:jar:1.1.3:compile 由于刚刚加了exclusions参数设置,导致commons-logging失效 实验成功 ———————————————— 原文链接:https://blog.csdn.net/mxg1120/article/details/121585528
-
现在的项目一般是拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用<dependency>标签来进行jar包的引入即可。 <dependency>其实就是依赖,关于依赖管理里面都涉及哪些内容,我们就一个个来分析下: 依赖传递 可选依赖 排除依赖 我们先来说说什么是依赖: 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。 格式为: <!--设置当前项目所依赖的所有jar--> <dependencies> <!--设置具体的依赖--> <dependency> <!--依赖所属群组id--> <groupId>org.springframework</groupId> <!--依赖所属项目id--> <artifactId>spring-webmvc</artifactId> <!--依赖版本号--> <version>5.2.10.RELEASE</version> </dependency> </dependencies> 一、依赖传递与冲突问题 1.1 依赖下钻 比如下面的项目的依赖中 有一个比较大的区别就是有的依赖前面有箭头>,有的依赖前面没有。 那么这个箭头所代表的含义是什么?打开前面的箭头,你会发现这个jar包下面还包含有其他的jar包 1.2 依赖具有传递性 说明:A代表自己的项目;B,C,D,E,F,G代表的是项目所依赖的jar包;D1和D2 E1和E2代表是相同jar包的不同版本 (1) A依赖了B和C,B和C有分别依赖了其他jar包,所以在A项目中就可以使用上面所有jar包,这就是所说的依赖传递 (2) 依赖传递有直接依赖和间接依赖 相对于A来说,A直接依赖B和C,间接依赖了D1,E1,G,F,D2和E2 相对于B来说,B直接依赖了D1和E1,间接依赖了G 直接依赖和间接依赖是一个相对的概念 (3)因为有依赖传递的存在,就会导致jar包在依赖的过程中出现冲突问题,具体什么是冲突?Maven是如何解决冲突的? 这里所说的依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。 情况一: 在pom.xml中添加两个不同版本的Junit依赖: <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> 通过对比,会发现一个结论 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。 情况二: 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高 A通过B间接依赖到E1 A通过C间接依赖到E2 A就会间接依赖到E1和E2,Maven会按照层级来选择,E1是2度,E2是3度,所以最终会选择E1 情况三: 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的 A通过B间接依赖到D1 A通过C间接依赖到D2 D1和D2都是两度,这个时候就不能按照层级来选择,需要按照声明来,谁先声明用谁,也就是说B在C之前声明,这个时候使用的是D1,反之则为D2 但是对应上面这些结果,大家不需要刻意去记它。因为不管Maven怎么选,最终的结果都会在Maven的Dependencies面板中展示出来,展示的是哪个版本,也就是说它选择的就是哪个版本 如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies,例如 在这个视图中就能很明显的展示出jar包之间的相互依赖关系。 二、可选依赖和排除依赖 依赖传递介绍完以后,我们来思考一个问题, maven_02_ssm 依赖了 maven_04_dao maven_04_dao 依赖了 maven_03_pojo 因为现在有依赖传递,所以maven_02_ssm能够使用到maven_03_pojo的内容 如果说现在不想让maven_02_ssm依赖到maven_03_pojo,有哪些解决方案? 说明:在真实使用的过程中,maven_02_ssm中是需要用到maven_03_pojo的,我们这里只是用这个例子描述我们的需求。因为有时候,maven_04_dao出于某些因素的考虑,就是不想让别人使用自己所依赖的maven_03_pojo。 方案一:可选依赖 可选依赖指对外隐藏当前所依赖的资源---指不透明 在maven_04_dao的pom.xml,在引入maven_03_pojo的时候,添加optional <dependency> <groupId>com.itheima</groupId> <artifactId>maven_03_pojo</artifactId> <version>1.0-SNAPSHOT</version> <!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递--> <optional>true</optional> </dependency> 此时就出问题了,说明由于maven_04_dao将maven_03_pojo设置成可选依赖,导致maven_02_ssm无法引用到maven_03_pojo中的内容,导致需要的类找不到。 方案二:排除依赖 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本---指不需要 前面我们已经通过可选依赖实现了阻断maven_03_pojo的依赖传递,对于排除依赖,则指的是已经有依赖的事实,也就是说maven_02_ssm项目中已经通过依赖传递用到了maven_03_pojo,此时我们需要做的是将其进行排除,所以接下来需要修改maven_02_ssm的pom.xml <dependency> <groupId>com.itheima</groupId> <artifactId>maven_04_dao</artifactId> <version>1.0-SNAPSHOT</version> <!--排除依赖是隐藏当前资源对应的依赖关系--> <exclusions> <exclusion> <groupId>com.itheima</groupId> <artifactId>maven_03_pojo</artifactId> </exclusion> </exclusions> </dependency> 排除依赖资源仅需指定groupId,artifactId即可,不用指定version,会把不同的版本都排除掉 当然exclusions标签带s说明我们是可以依次排除多个依赖到的jar包,比如maven_04_dao中有依赖junit和mybatis,我们也可以一并将其排除。 <dependency> <groupId>com.itheima</groupId> <artifactId>maven_04_dao</artifactId> <version>1.0-SNAPSHOT</version> <!--排除依赖是隐藏当前资源对应的依赖关系--> <exclusions> <exclusion> <groupId>com.itheima</groupId> <artifactId>maven_03_pojo</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> </exclusions> </dependency> 介绍我这两种方式后,简单来梳理下,就是 A依赖B,B依赖C,C通过依赖传递会被A使用到,现在要想办法让A不去依赖C 可选依赖是在B上设置<optional>,A不知道有C的存在,代表这个依赖是否需要被发现。这种适用于可以修改B的配置文件的情况下 排除依赖是在A上设置<exclusions>,A知道有C的存在,主动将其排除掉。代表这个依赖已经被发现,但自己是否需要引用。这种适用于不能修改B的配置文件的情况下 ———————————————— 原文链接:https://blog.csdn.net/FaithWh/article/details/128211910
-
依赖 依赖关系,可以理解成“USE-A”关系即使用关系。 依赖关系是一种使用关系,如果A类中使用了B类对象,那么就可以说A类依赖B类。 依赖传递 项目A直接依赖项目B,项目B直接依赖项目C,maven会间接地将A依赖C,这就是依赖传递。类/第三方库也是同样的道理。 可选依赖和依赖排除 以上图为例,当需要在项目A中排除对项目C的依赖时,这时又该怎么做呢?Maven 为我们提供了两种解决方案,分别是可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)。 什么时候需要排除依赖? 项目A依赖项目B,但当项目A不是完全依赖项目B的时候,即项目A只用到了项目B的一部分功能,而正巧项目B这部分功能的实现,并不需要依赖于项目C,这个时候,项目A就应该排除对项目C的依赖。 有的人可能有这样的疑问,为什么要排除对项目C的依赖呢?就算包含了对项目C的依赖,也不会出问题啊。事实上,表面上看确实不会出现问题。但是,我们必须记住一点:当我们使用一个工程时,控制实际需要的依赖列表非常重要。而且,排除不必要的依赖还可以帮助我们,节约磁盘、内存等空间,避免许可协议问题以及类路径问题等。我们在享受Maven依赖的自动传递性带给我们的便利的同时,要时刻注意引入冗余、不必要的依赖对我们项目产生的负面影响。 可选依赖(Optional Dependencies) optional英文意思是可选的,可以让子工程自己决定要不要此依赖 默认为false,表示依赖会传递给子工程,子工程没得选,被迫接受该依赖。 如果为true,表示依赖不会传递给子工程。子工程不会有该依赖。当需要时,子工程可以在pom文件中添加该依赖 ———————————————— 原文链接:https://blog.csdn.net/qq_41740883/article/details/106965161
-
1、概念介绍 Dependencies:是可选依赖(Optional Dependencies) Exclusions:是依赖排除(Dependency Exclusions) 2、Dependencies (1)当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖。举例来说,一个类似hibernate的项目,它支持对mysql、oracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。 (2)配置可选依赖的原因: 1)节约磁盘、内存等空间; 2)避免license许可问题; 3)避免类路径问题,等等。 (3)示例: <project> ... <dependencies> <!-- declare the dependency to be set as optional --> <dependency> <groupId>sample.ProjectB</groupId> <artifactId>Project-B</artifactId> <version>1.0</version> <scope>compile</scope> <optional>true</optional> <!-- value will be true or false only --> </dependency> </dependencies> </project> 假设以上配置是项目A的配置,即:Project-A –> Project-B。在编译项目A时,是可以正常通过的。如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。假设A->B, B->x(可选), B->y(可选)。这里由于x,y是可选依赖,依赖不会传递,x,y将不会对a有任何影响 3、Exclusions (1)当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖。 (2)示例(假设配置的是A的pom.xml,依赖关系为:A –> B; B –> C): <project> ... <dependencies> <dependency> <groupId>sample.ProjectB</groupId> <artifactId>Project-B</artifactId> <version>1.0</version> <scope>compile</scope> <exclusions> <exclusion> <!-- declare the exclusion here --> <groupId>sample.ProjectC</groupId> <artifactId>Project-C</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project> 4、maven的依赖调解有两大原则:路径最近者优先;第一声明者优先。 5、maven的归类依赖 <properties> <springframework.version>2.5.6<springframework.version> </properties> ———————————————— 原文链接:https://blog.csdn.net/qq_18671415/article/details/119139686
-
IDEA 配置 Git 1、Windows 上 Git 安装完成后就可以在 git 自带的命令行工具中执行 git 命令,IDEA 想要使用 git ,则需要进行简单的配置,类似与 maven 配置一样,指定 git.exe 程序路径即可。 2、配置 git :File–>Setting–>Version Control–>Git 面板的 Path to Git executable 中选中 git.exe 的位置即完成了 git 的配置。点击右侧的 "Test" 按钮可以检测配置是否成功。 3、所谓的配置:其实就是本机安装完成 git 后,在 IDEA 中检查一下是否连接成功,因为 IDEA 也是通过给本地的 git 客户端发送命令。IDEA 工具在安装的时候就默认安装了 Git 插件。 一、整体合并 团队协作中,开发人员A、B、C分别在dev上进行功能开发,并push代码到远端dev上。当测试人员需要对功能进行测试的时候,我们需要把dev上新增的功能代码合并到test分支上去。 步骤: 1、将dev上的代码push到远端dev上。 2、切换分支到test分支。(就是切换到将要合并的目标分支) 3、拉取代码,确保test分支为远端最新的代码。4、合并分支5、有冲突,先解决冲突后再合并,没有冲突则合并成功。 6、push代码到远端test分支上去。 二、针对某次提交的合并 团队协作中,开发人员较多,采用上面统一合并分支的形式,如果出现冲突,需要询问对应的开发人员进行代码的取舍,有代码丢失和错乱的风险,所以我们在项目开发中会采用遴选合并分支的方式。(自己写的代码,自己合并到对应的目标分支上去) 步骤: 1、在dev分支上,查看提交历史。 2、复制某次提交的版本号。3、切换到test分支(注意:切换成功后,最好pull拉取下代码,再执行下图命令),按下图执行命令。4、大功告成!可以归纳为以下步骤:如把你个人的分支合并到dev分支: 1.切换到dev分支 右下角选择dev分支,checkout即可.需要注意的是:先把你分支提交后再切,不然会有异常 2.右键项目---git---repository---merge changes,选中dev,merge.或者直接点击右下角的dev,在弹出的分支中点击要合并的分支,在弹出的选项中选择merge即可. 3.如果没有冲突,直接提交即可.如果有冲突,则需要解决冲突再提交. ———————————————— 原文链接:https://blog.csdn.net/wucaiyun225/article/details/122844223
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签