Quarkus使用InMemoryConfigSource后本地运行仍部署Docker问题求助
问题
为了隐藏application.properties中的数据库凭证,我实现了InMemoryConfigSource类并移除了配置文件里的数据源凭证信息。但现在不管怎么选本地配置,运行应用时都会在Docker里创建新数据库并在Docker环境运行。我需要实现本地运行应用并连接远程数据库,而且因为要以编程方式隐藏和修改quarkus.datasource.jdbc.url,所以credentials-provider方案不适用。
我的InMemoryConfigSource类
import io.quarkus.runtime.annotations.StaticInitSafe; import org.eclipse.microprofile.config.spi.ConfigSource; import java.util.Map; import java.util.HashMap; import java.util.Set; @StaticInitSafe public class InMemoryConfigSource implements ConfigSource { private static final Map<String, String> configuration = new HashMap<>(); static { configuration.put("quarkus.datasource.db-kind", "postgresql"); configuration.put("quarkus.datasource.jdbc.url" ,"url"); configuration.put("quarkus.datasource.username" , "foo"); configuration.put("quarkus.datasource.password" , "bar"); configuration.put("quarkus.hibernate-orm.database.generation", "update"); } @Override public int getOrdinal() { return 400; } @Override public Set<String> getPropertyNames() { return configuration.keySet(); } @Override public String getValue(final String propertyName) { return configuration.get(propertyName); } @Override public String getName() { return InMemoryConfigSource.class.getSimpleName(); } }
pom.xml
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxxx</groupId> <artifactId>xxx-xxx</artifactId> <version>1.0-SNAPSHOT</version> <properties> <compiler-plugin.version>3.11.0</compiler-plugin.version> <maven.compiler.release>17</maven.compiler.release> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id> <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id> <quarkus.platform.version>3.0.3.Final</quarkus.platform.version> <skipITs>true</skipITs> <surefire-plugin.version>3.0.0</surefire-plugin.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>${quarkus.platform.artifact-id}</artifactId> <version>${quarkus.platform.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm-panache</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-arc</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5-mockito</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.20</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.13</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-reactive</artifactId> </dependency> <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>3.0.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.platform.version}</version> <extensions>true</extensions> <executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> <goal>generate-code-tests</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${compiler-plugin.version}</version> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-plugin.version}</version> <configuration> <systemPropertyVariables> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>${surefire-plugin.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <systemPropertyVariables> <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </execution> </executions> </plugin> </plugins> </build> <profiles> <profile> <id>native</id> <activation> <property> <name>native</name> </property> </activation> <properties> <skipITs>false</skipITs> <quarkus.package.type>native</quarkus.package.type> </properties> </profile> </profiles> </project>
解决方案
1. 注册自定义配置源
Quarkus无法自动识别你的InMemoryConfigSource,需要手动注册:
在src/main/resources/META-INF/services目录下创建文件org.eclipse.microprofile.config.spi.ConfigSource,内容为你的类全限定名(替换成实际包路径):
com.xxxx.InMemoryConfigSource
2. 关闭Dev Services自动创建Docker数据库
Quarkus开发模式下默认会启动Dev Services自动创建Docker数据库,需要在你的配置源中添加配置强制关闭:
configuration.put("quarkus.datasource.devservices.enabled", "false");
3. 调整配置源优先级(可选)
当前getOrdinal()返回400,和系统属性优先级相同,系统属性会覆盖你的配置。如果需要让自定义配置源优先级更高,修改返回值为450:
@Override public int getOrdinal() { return 450; }
4. 验证远程数据库连接信息
确保quarkus.datasource.jdbc.url是正确的远程PostgreSQL格式:
jdbc:postgresql://<远程主机IP>:<端口>/<数据库名>
同时确认远程数据库允许本地IP访问,用户名和密码正确。
5. 本地启动时强制指定配置源(可选)
如果仍有问题,用Maven命令启动时添加参数:
./mvnw quarkus:dev -Dquarkus.config.source.in-memory.enabled=true
内容的提问来源于stack exchange,提问作者oural.keser
相关产品推荐
相关产品推荐

