乐闻世界logo
搜索文章和话题

面试题手册

Maven 的依赖范围(scope)有哪些类型?各自的使用场景是什么?

Maven 的依赖范围(scope)决定了依赖在项目不同阶段的有效性,主要包括以下几种:compile:默认范围,依赖在编译、测试和运行时都有效。例如:spring-core、commons-lang3 等核心库。provided:依赖在编译和测试时有效,但在运行时由容器或 JDK 提供。例如:servlet-api、jsp-api 等由 Web 容器提供的 API。runtime:依赖在测试和运行时有效,但在编译时不需要。例如:JDBC 驱动(如 mysql-connector-java),编译时只需要 JDBC 接口。test:依赖仅在测试时有效,不会被打包到最终产物中。例如:JUnit、Mockito 等测试框架。system:类似 provided,但需要显式指定本地 jar 包路径,不推荐使用。import:仅在 dependencyManagement 中使用,用于导入其他 POM 的依赖管理配置。依赖范围还会影响依赖传递性。例如,如果 A 依赖 B(scope=compile),B 依赖 C(scope=test),则 C 不会传递给 A。理解依赖范围对于避免类冲突、减小最终包大小、提高构建效率非常重要。在实际项目中,合理配置依赖范围可以避免不必要的依赖传递,减少 jar 包冲突,优化项目结构。例如,将 Lombok 配置为 provided 范围,因为它只在编译时需要;将日志实现(如 logback)配置为 runtime,因为编译时只需要日志接口。
阅读 0·2月18日 21:34

Maven 插件是如何工作的?常用的 Maven 插件有哪些?

Maven 插件(Plugin)是 Maven 构建系统的核心组件,用于执行具体的构建任务。每个插件包含一个或多个目标(Goal),目标对应于构建过程中的具体操作。插件的基本概念:插件:一组相关目标的集合,用于完成特定类型的构建任务目标(Goal):插件中的单个任务,可以单独执行或绑定到生命周期阶段生命周期绑定:将插件目标绑定到 Maven 生命周期的某个阶段,自动执行常用插件:maven-compiler-plugin:编译 Java 源代码<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>11</source> <target>11</target> <encoding>UTF-8</encoding> </configuration></plugin>maven-surefire-plugin:运行单元测试<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0</version> <configuration> <skipTests>false</skipTests> <includes> <include>**/*Test.java</include> </includes> </configuration></plugin>maven-jar-plugin:打包 JAR 文件<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration></plugin>maven-war-plugin:打包 WAR 文件maven-resources-plugin:处理资源文件maven-assembly-plugin:创建自定义分发包spring-boot-maven-plugin:Spring Boot 项目打包插件配置方式:直接配置:在 <build><plugins> 中直接配置插件插件管理:在 <build><pluginManagement> 中统一管理插件版本和配置绑定插件目标到生命周期:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions></plugin>常用插件命令:mvn plugin:goal:执行特定插件目标,如 mvn compiler:compilemvn help:describe -Dplugin=plugin-name:查看插件详细信息mvn help:effective-pom:查看有效的 POM 配置最佳实践:在父 POM 中使用 pluginManagement 统一管理插件版本合理配置插件参数,避免不必要的默认行为使用插件绑定自动化构建流程定期更新插件版本,获取新功能和修复对于大型项目,使用 profile 区分不同环境的插件配置
阅读 0·2月18日 21:34

Maven 仓库有哪些类型?如何配置私有仓库和镜像?

Maven 仓库用于存储和管理构建过程中产生的各种构件(Artifacts),包括依赖、插件和项目产物。Maven 仓库分为三种类型:本地仓库、中央仓库和远程仓库。1. 本地仓库(Local Repository):位置:默认在用户目录下的 .m2/repository 文件夹作用:存储从远程仓库下载的依赖和项目构建产物配置:在 settings.xml 中通过 <localRepository> 标签自定义位置优势:避免重复下载,提高构建速度,支持离线构建2. 中央仓库(Central Repository):URL:https://repo.maven.apache.org/maven2作用:Maven 官方维护的公共仓库,包含大量开源项目特点:无需配置即可使用,由 Maven 社区维护限制:只能上传到中央仓库的项目需要满足严格的要求3. 远程仓库(Remote Repository):作用:企业或团队内部搭建的私有仓库,或第三方公共仓库常见实现:Nexus、Artifactory、Archiva配置方式:<repositories> <repository> <id>company-repo</id> <url>https://repo.company.com/maven2</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository></repositories>仓库查找顺序:本地仓库:首先查找本地是否已存在所需构件远程仓库:按配置顺序依次查找远程仓库中央仓库:如果远程仓库都找不到,最后查找中央仓库镜像配置(Mirror):镜像用于替代远程仓库,通常用于加速下载或使用企业内部仓库:<mirrors> <mirror> <id>aliyun-maven</id> <mirrorOf>central</mirrorOf> <name>Aliyun Maven Mirror</name> <url>https://maven.aliyun.com/repository/public</url> </mirror></mirrors>仓库认证配置:对于需要认证的私有仓库,在 settings.xml 中配置:<servers> <server> <id>company-repo</id> <username>admin</username> <password>password</password> </server></servers>最佳实践:使用国内镜像加速中央仓库访问企业内部搭建私有仓库管理内部依赖区分 releases 和 snapshots 仓库,避免不稳定版本污染定期清理本地仓库,释放磁盘空间使用 mvn dependency:purge-local-repository 清理本地依赖
阅读 0·2月18日 21:34

Maven 和 Gradle 有什么区别?如何选择合适的构建工具?

Maven 和 Gradle 都是 Java 项目的主流构建工具,但它们在设计理念、配置方式、性能和生态系统等方面存在显著差异。1. 配置方式:Maven:使用 XML 格式的 pom.xml 文件,配置结构化但较为冗长Gradle:使用 Groovy 或 Kotlin DSL,配置简洁灵活,支持编程式配置2. 性能:Maven:构建速度相对较慢,增量构建支持有限Gradle:构建速度快,支持增量构建和构建缓存,特别适合大型项目3. 依赖管理:Maven:依赖传递性规则固定,依赖冲突解决机制明确Gradle:依赖管理更灵活,支持动态版本、强制版本等高级特性4. 插件系统:Maven:插件生态成熟,但扩展性相对有限Gradle:插件系统灵活,可以轻松自定义任务和插件5. 约定优于配置:Maven:严格遵循约定,项目结构标准化Gradle:既支持约定也支持自定义,灵活性更高6. 学习曲线:Maven:学习曲线平缓,配置直观,适合初学者Gradle:学习曲线较陡,需要掌握 DSL 语法7. 多语言支持:Maven:主要支持 Java 项目,对其他语言支持有限Gradle:原生支持 Java、Groovy、Kotlin、Scala 等多种语言8. 构建生命周期:Maven:固定的生命周期阶段,流程清晰Gradle:基于任务(Task)的构建模型,流程更灵活选择建议:选择 Maven 的场景:项目已经使用 Maven,团队熟悉 Maven需要严格遵循标准化的项目结构企业级项目,需要稳定的构建工具团队成员对 XML 配置更熟悉需要与现有 Maven 生态集成选择 Gradle 的场景:大型项目,需要更快的构建速度需要灵活的自定义构建逻辑项目使用多种编程语言团队熟悉 Groovy 或 Kotlin需要更灵活的依赖管理迁移建议:从 Maven 迁移到 Gradle 可以使用 Gradle 的 Maven 插件逐步迁移,先在子项目中尝试 Gradle评估迁移成本和收益,避免盲目迁移总结:Maven 适合标准化、稳定的企业级项目,Gradle 适合需要高性能和灵活性的现代项目。选择时需要综合考虑项目需求、团队技能和长期维护成本。
阅读 0·2月18日 21:33

Maven 常用命令有哪些?如何使用 Maven 命令提高开发效率?

Maven 常用命令涵盖了项目构建、依赖管理、插件操作等多个方面,熟练掌握这些命令对于提高开发效率至关重要。项目构建命令:mvn clean:清理项目,删除 target 目录mvn compile:编译项目源代码mvn test:运行单元测试mvn package:打包项目(JAR、WAR 等)mvn install:将项目安装到本地仓库mvn deploy:将项目部署到远程仓库mvn clean install:清理并安装项目mvn clean package -DskipTests:打包并跳过测试依赖管理命令:mvn dependency:tree:显示依赖树,查看依赖关系mvn dependency:list:列出项目所有依赖mvn dependency:analyze:分析依赖,识别未使用和声明的依赖mvn dependency:sources:下载依赖的源代码mvn dependency:resolve:解析并下载所有依赖mvn dependency:purge-local-repository:清理本地仓库中的依赖插件操作命令:mvn plugin:help:显示插件帮助信息mvn help:describe -Dplugin=plugin-name:查看插件详细信息mvn help:effective-pom:查看有效的 POM 配置mvn help:active-profiles:查看当前激活的 Profilemvn help:all-profiles:查看所有可用的 Profilemvn archetype:generate:从原型生成新项目多模块项目命令:mvn clean install -pl module-a:只构建 module-amvn clean install -pl module-a -am:构建 module-a 及其依赖的模块mvn clean install -pl '!module-a':构建除 module-a 外的所有模块mvn clean install -rf module-a:从 module-a 开始构建其他常用命令:mvn -v 或 mvn --version:查看 Maven 版本mvn -X:启用调试模式,查看详细日志mvn -Dmaven.test.skip=true:跳过测试mvn -Pprofile-name:激活指定的 Profilemvn -Dproperty=value:设置系统属性实用技巧:离线构建:mvn -o clean install 使用本地仓库离线构建并行构建:mvn -T 4 clean install 使用 4 个线程并行构建批量更新依赖:mvn versions:display-dependency-updates 查看可更新的依赖强制更新快照:mvn clean install -U 强制更新 SNAPSHOT 依赖跳过特定插件:mvn clean install -Dmaven.plugin.skip=true最佳实践:在 CI/CD 流程中使用 mvn clean install 确保构建的完整性开发阶段使用 mvn compile 和 mvn test 快速验证代码定期运行 mvn dependency:analyze 清理未使用的依赖使用 mvn dependency:tree 分析依赖冲突在多模块项目中合理使用 -pl 和 -am 参数提高构建效率掌握这些 Maven 命令可以显著提高开发效率,快速定位和解决构建问题。
阅读 0·2月18日 21:33

SQLite 的日期和时间函数如何使用?

SQLite 的日期和时间函数提供了丰富的日期处理能力:日期时间存储格式SQLite 没有专门的日期时间类型通常以 TEXT(ISO8601 字符串)、REAL(Julian 日数)或 INTEGER(Unix 时间戳)存储推荐使用 TEXT 类型存储 ISO8601 格式:'YYYY-MM-DD HH:MM:SS'主要日期时间函数date():返回日期time():返回时间datetime():返回日期时间julianday():返回 Julian 日数strftime():格式化日期时间unixepoch():Unix 时间戳转换获取当前日期时间 -- 当前日期 SELECT date('now'); -- 输出: 2026-02-18 -- 当前时间 SELECT time('now'); -- 输出: 11:24:00 -- 当前日期时间 SELECT datetime('now'); -- 输出: 2026-02-18 11:24:00 -- 当前 Unix 时间戳 SELECT strftime('%s', 'now'); -- 输出: 1739869440日期时间计算 -- 加减天数 SELECT date('now', '+7 days'); SELECT date('now', '-1 month'); -- 加减时间 SELECT datetime('now', '+3 hours', '-30 minutes'); -- 计算日期差 SELECT julianday('now') - julianday('2026-01-01');日期时间格式化 -- 自定义格式 SELECT strftime('%Y-%m-%d %H:%M:%S', 'now'); -- 常用格式说明符 -- %Y: 4位年份 -- %m: 月份 (01-12) -- %d: 日期 (01-31) -- %H: 小时 (00-23) -- %M: 分钟 (00-59) -- %S: 秒 (00-59) -- %w: 星期 (0-6, 0=周日) -- %j: 一年中的第几天 (001-366)日期时间解析 -- 解析字符串为日期时间 SELECT datetime('2026-02-18 11:24:00'); -- 从 Unix 时间戳转换 SELECT datetime(1739869440, 'unixepoch'); -- 从 Julian 日数转换 SELECT datetime(2460585.974, 'julianday');日期时间比较 -- 比较日期 SELECT * FROM orders WHERE order_date > date('now', '-30 days'); -- 日期范围查询 SELECT * FROM events WHERE event_date BETWEEN date('now') AND date('now', '+7 days');实际应用场景 -- 创建订单表 CREATE TABLE orders ( id INTEGER PRIMARY KEY, order_date TEXT, status TEXT ); -- 插入当前时间 INSERT INTO orders (order_date, status) VALUES (datetime('now'), 'pending'); -- 查询今天的订单 SELECT * FROM orders WHERE date(order_date) = date('now'); -- 查询本周的订单 SELECT * FROM orders WHERE order_date >= date('now', 'weekday 0', '-7 days');时区处理 -- UTC 时间 SELECT datetime('now', 'utc'); -- 本地时间 SELECT datetime('now', 'localtime'); -- 时区转换 SELECT datetime('now', '+8 hours');性能优化为日期列创建索引使用函数包装列会导致索引失效考虑使用生成列存储格式化日期避免在 WHERE 子句中使用复杂日期函数SQLite 的日期时间函数功能强大,能够满足大多数日期处理需求。
阅读 0·2月18日 21:33

SQLite 的全文搜索(FTS)功能如何使用?

SQLite 的全文搜索(FTS)功能提供高效的文本搜索能力:FTS 扩展模块SQLite 提供 FTS3、FTS4、FTS5 三个版本FTS5 是最新版本,功能最强大需要在编译时启用相应的扩展创建 FTS 表 -- 使用 FTS5 创建全文搜索表 CREATE VIRTUAL TABLE articles_fts USING fts5(title, content); -- 使用 FTS4 创建全文搜索表 CREATE VIRTUAL TABLE articles_fts USING fts4(title, content);插入数据 -- 插入数据到 FTS 表 INSERT INTO articles_fts (title, content) VALUES ('SQLite Tutorial', 'SQLite is a lightweight database...');全文搜索查询 -- 简单搜索 SELECT * FROM articles_fts WHERE articles_fts MATCH 'SQLite'; -- 短语搜索 SELECT * FROM articles_fts WHERE articles_fts MATCH '"lightweight database"'; -- 布尔搜索 SELECT * FROM articles_fts WHERE articles_fts MATCH 'SQLite AND database'; -- 前缀搜索 SELECT * FROM articles_fts WHERE articles_fts MATCH 'data*';FTS5 高级功能外部内容表:将 FTS 表与普通表关联 CREATE TABLE articles(id, title, content); CREATE VIRTUAL TABLE articles_fts USING fts5(title, content, content='articles', content_rowid='id');触发器自动同步:使用触发器保持 FTS 表与源表同步排名函数:使用 bm25() 函数进行结果排序性能优化为大型文档创建 FTS 索引使用批量插入提高性能定期优化 FTS 表 INSERT INTO articles_fts(articles_fts) VALUES('optimize');使用场景文档搜索系统日志分析产品搜索内容管理系统代码搜索FTS 功能使 SQLite 能够处理复杂的文本搜索需求,是构建搜索功能的重要工具。
阅读 0·2月18日 21:33

SQLite 的事务机制是如何工作的?

SQLite 的事务机制遵循 ACID 原则:原子性(Atomicity)事务中的所有操作要么全部成功,要么全部失败使用 BEGIN TRANSACTION 开始事务,COMMIT 提交事务,ROLLBACK 回滚事务SQLite 使用预写日志(WAL)或回滚日志来保证原子性一致性(Consistency)事务执行前后,数据库必须保持一致状态所有约束(主键、外键、唯一约束、检查约束)在事务提交时被验证违反约束的操作会导致事务回滚隔离性(Isolation)SQLite 默认使用串行化隔离级别读操作不会阻塞其他读操作写操作会获得数据库的排他锁,阻止其他写操作支持多种隔离模式:DEFERRED、IMMEDIATE、EXCLUSIVE持久性(Durability)事务提交后,对数据库的修改是永久性的数据写入磁盘后才返回提交成功使用同步模式(synchronous)控制数据持久性级别事务控制命令 BEGIN TRANSACTION; -- 开始事务 -- 执行 SQL 操作 COMMIT; -- 提交事务 -- 或 ROLLBACK; -- 回滚事务自动事务如果没有显式开始事务,SQLite 会为每个语句自动创建事务建议在复杂操作中使用显式事务以提高性能和保证数据一致性保存点(Savepoints)支持嵌套事务和部分回滚使用 SAVEPOINT 创建保存点,RELEASE SAVEPOINT 释放,ROLLBACK TO SAVEPOINT 回滚到指定点SQLite 的事务机制确保了数据的安全性和一致性,特别适合需要强一致性保证的应用场景。
阅读 0·2月18日 21:33

什么是 SQLite 的 WAL 模式?它有什么优势?

SQLite 的 WAL(Write-Ahead Logging)模式是一种重要的性能优化机制:WAL 模式原理传统回滚日志模式:写操作直接修改数据库文件,使用回滚日志记录变更WAL 模式:写操作将变更写入 WAL 文件,而不是直接修改数据库文件检查点(Checkpoint)时将 WAL 文件的内容合并到主数据库文件WAL 模式的优势提高并发性:读操作不会阻塞写操作,写操作不会阻塞读操作减少磁盘 I/O:写入操作通常是顺序的,比随机写入更快更好的崩溃恢复:WAL 文件包含所有未提交的变更,恢复更可靠提高写入性能:多个写入可以批量提交,减少同步操作启用 WAL 模式 PRAGMA journal_mode = WAL;WAL 文件管理WAL 文件与数据库文件在同一目录下,后缀为 -wal 和 -shm-wal 文件存储实际的 WAL 数据-shm 文件是共享内存文件,用于协调并发访问检查点(Checkpoint)机制自动检查点:当 WAL 文件达到一定大小时自动触发手动检查点:使用 PRAGMA wal_checkpoint(TRUNCATE); 手动触发检查点将 WAL 文件中的有效变更合并到主数据库文件WAL 模式的限制不支持某些旧的 SQLite 版本在网络文件系统上可能不可靠需要额外的磁盘空间存储 WAL 文件某些情况下可能导致数据库文件增长适用场景高并发读写场景需要更好的崩溃恢复能力写入密集型应用移动应用和桌面应用WAL 模式是 SQLite 推荐的默认配置,能够显著提高大多数应用场景下的性能。
阅读 0·2月18日 21:32