
在复杂的maven多模块项目中,不同的模块可能需要共享配置文件、模板或其他非代码资源。一个常见的场景是,一个测试模块需要访问另一个模块中定义的全局配置。直接通过文件系统路径(例如./project-config/configs/application_config.yaml)来引用这些文件通常会导致以下问题:
为了避免上述问题,例如将配置文件从一个模块复制到另一个模块的src/test/resources,我们需要采用Maven推荐的资源共享机制。
Maven的核心优势之一是其强大的依赖管理能力。当一个模块(消费者模块)声明对另一个模块(提供者模块)的依赖时,提供者模块的编译输出(包括编译后的类文件和资源文件)都会被添加到消费者模块的类路径中。
关键点: Maven默认会将src/main/resources目录下的所有文件视为资源,并在构建过程中将其打包到JAR文件中,最终使其在运行时位于类路径上。
为了让project-algo模块能够访问project-config模块中的application_config.yaml文件,我们需要遵循以下两个核心步骤:
首先,在需要访问资源的模块(例如project-algo)的pom.xml文件中,添加对包含资源的模块(例如project-config)的依赖。
project-algo/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>com.company.project</groupId>
<artifactId>project</artifactId>
<version>${project.version}</version>
</parent>
<artifactId>project-algo</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 依赖 project-base 模块 -->
<dependency>
<groupId>com.company.project</groupId>
<artifactId>project-base</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 新增:依赖 project-config 模块 -->
<dependency>
<groupId>com.company.project</groupId>
<artifactId>project-config</artifactId>
<version>${project.version}</version>
<!-- 建议使用 test 范围,如果该配置只用于测试 -->
<scope>test</scope>
</dependency>
<!-- 其他依赖... -->
</dependencies>
</project>scope 注意事项:
为了让application_config.yaml能够通过类加载器访问,它必须位于project-config模块的src/main/resources目录下。
文件结构调整建议:
project-config
├── pom.xml
└── src
└── main
└── resources
└── application_config.yaml如果无法移动文件(例如configs目录必须保持独立):
如果application_config.yaml必须保留在project-config/configs/目录下,并且您希望它能作为资源被访问,您需要在project-config的pom.xml中配置Maven的资源插件,将configs目录声明为资源目录:
project-config/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>com.company.project</groupId>
<artifactId>project</artifactId>
<version>${project.version}</version>
</parent>
<artifactId>project-config</artifactId>
<packaging>jar</packaging>
<build>
<resources>
<!-- 默认资源目录 -->
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- 将 configs 目录也作为资源目录 -->
<resource>
<directory>configs</directory>
<includes>
<include>**/*.yaml</include>
</includes>
<!-- targetPath 可以指定资源在 JAR 包中的路径,默认为根目录 -->
<targetPath>.</targetPath>
</resource>
</resources>
<plugins>
<!-- 其他插件 -->
</plugins>
</build>
<!-- 其他配置 -->
</project>通过上述配置,project-config/configs/application_config.yaml 将会在project-config模块打包时被包含在JAR的根目录下,从而在project-algo的类路径上可用。
一旦project-config作为依赖添加到project-algo,并且application_config.yaml被正确地置于project-config的资源目录下,project-algo就可以通过类加载器来访问这个文件了。
YamlReader 修改示例:
package com.company.project.util.io;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; // 泛化,如果YamlReader也用于JSON
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import java.io.IOException;
import java.io.InputStream;
public class YamlReader {
// 假设 ConfigParent 是一个通用的父接口或类
// public interface ConfigParent {}
public static <C extends ConfigParent> C readConfiguration(Class<C> configClass, String yamlFileName) throws IOException {
InputStream inputStream = null;
try {
// 使用当前类的类加载器来获取资源
// 资源路径是相对于类路径根目录的
// 如果 application_config.yaml 在 src/main/resources 下,直接使用文件名
// 如果在 project-config/configs 下并通过 pom 配置为资源,也直接使用文件名
inputStream = YamlReader.class.getClassLoader().getResourceAsStream(yamlFileName);
if (inputStream == null) {
// 尝试使用线程上下文类加载器,有时在某些环境中更可靠
inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(yamlFileName);
}
if (inputStream == null) {
throw new IOException("Resource not found on classpath: " + yamlFileName);
}
YAMLMapper mapper = new YAMLMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
return mapper.readValue(inputStream, configClass);
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
// 示例用法(在 AlgorithmTest 中)
// public void testReadConfig() {
// try {
// MyConfig config = YamlReader.readConfiguration(MyConfig.class, "application_config.yaml");
// // 处理 config 对象
// } catch (IOException e) {
// e.printStackTrace();
// // }
// }
}注意事项:
在Maven多模块项目中,跨模块共享资源的最佳实践是:
通过遵循这些原则,您可以构建出结构清晰、易于维护且部署灵活的Maven多模块项目。
以上就是Maven多模块项目中资源共享与配置管理指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号