将外部文件中的值加载到 pom.xml
Posted
技术标签:
【中文标题】将外部文件中的值加载到 pom.xml【英文标题】:Load values from external file into pom.xml 【发布时间】:2021-01-27 07:02:15 【问题描述】:我正在尝试从外部文件中读取 pom.xml 中的一些参数。我正在使用properties-maven-plugin,但我真的不介意任何其他解决方案从外部文件中读取值作为 pom 中的变量。
这是我的插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<goals>
<goal>read-project-properties</goal>
</goals>
<phase>initialize</phase>
<configuration>
<!--<files>
<file>$apps.basedir/apps/flywayvariables.properties</file>
<file>/home/gokul/git/sampleproject/apps/flywayvariables.properties</file>
</files>-->
<urls>
<url>file:///$apps.basedir/apps/flywayvariables.properties</url>
</urls>
</configuration>
</execution>
</executions>
</plugin>
这是我尝试使用它的地方:
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>7.0.1</version>
<configuration>
<sqlMigrationSeparator>__</sqlMigrationSeparator>
<locations>
<location>filesystem:$apps.basedir/apps/flyway</location>
</locations>
<url>jdbc:postgresql://localhost:9000/postgres</url>
<user>$dbuser</user>
<flyway.user>$dbuser</flyway.user>
<flyway.password>$dbpassword</flyway.password>
<password>$dbpassword</password>
</configuration>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.16</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>migrate</id>
<goals>
<goal>migrate</goal>
</goals>
<phase>initialize</phase>
</execution>
</executions>
</plugin>
这是我的属性文件:
<properties>
<dbuser>postgres</dbuser>
<dbpassword>test1234</dbpassword>
</properties>
当我运行 mvn -X initialize 时,我收到以下错误:
[DEBUG] Configuring mojo org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties from plugin realm ClassRealm[plugin>org.codehaus.mojo:properties-maven-plugin:1.0.0, parent: sun.misc.Launcher$AppClassLoader@5c647e05]
[DEBUG] Configuring mojo 'org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties' with basic configurator -->
[DEBUG] (f) project = MavenProject: com.example.company:sampleapplication @ /home/gokul/git/sampleproject/apps/pom.xml
[DEBUG] (f) quiet = false
[DEBUG] (s) urls = [file:////home/gokul/git/sampleproject/apps/flywayvariables.properties]
[DEBUG] -- end configuration --
[DEBUG] Loading properties from URL file:////home/gokul/git/sampleproject/apps/flywayvariables.properties
[INFO]
[INFO] --- flyway-maven-plugin:7.0.1:migrate (migrate) @ apps ---
... ... ...
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.422 s (Wall Clock)
[INFO] Finished at: 2020-10-13T01:18:40+02:00
[INFO] Final Memory: 33M/1237M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:7.0.1:migrate (migrate) on project apps: org.flywaydb.core.internal.exception.FlywaySqlException:
[ERROR] Unable to obtain connection from database (jdbc:postgresql://localhost:9000/postgres) for user 'null': The server requested password-based authentication, but no password was provided.
[ERROR] ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[ERROR] SQL State : 08004
[ERROR] Error Code : 0
[ERROR] Message : The server requested password-based authentication, but no password was provided.
我可以看到插件是按照我想要的顺序执行的,但属性没有加载。文件路径和权限应该不是问题,因为我使用与执行 maven 项目相同的用户帐户创建了属性文件。 No password was provided 错误更改为 authentication failed 当我手动输入密码并且仅将 $dbuser 保留为变量时出现错误。我也尝试过更改变量的名称,但徒劳无功。在 properties-maven-plugin 配置中,我尝试提供 files 而不是 urls,但它对 maven 没有任何影响。
很遗憾,this 问题中的解决方案都没有帮助我。
尝试了以下 maven 目标:
初始化 验证 验证 安装 属性:读取项目属性初始化【问题讨论】:
【参考方案1】:我很确定您需要以传统方式编写属性文件,例如
dbuser=postgres
dbpassword=test1234
【讨论】:
令人惊讶的是,当我昨天检查这个时,它没有工作。但是今天成功了!我必须说重新启动有帮助。从来没有想过我必须提供一个纯文本属性文件,这也没有在任何地方提到。非常感谢!【参考方案2】:我不知道为什么属性插件不起作用,但是 Flyway 本身支持多种方法将这些设置存储在 pom.xml 之外。有关详细信息,请参阅Flyway maven documentation。
以下是链接中的一些sn-ps:
配置文件
Flyway 将搜索并自动加载 <user-home>/flyway.conf
配置文件(如果存在)。
也可以将 Flyway 指向一个或多个附加配置文件。这是通过提供系统属性flyway.configFiles
来实现的,如下所示:
mvn -Dflyway.configFiles=path/to/myAlternativeConfig.conf flyway:migrate
更多信息请参见https://flywaydb.org/documentation/maven/#config-files。
Maven 设置
也可以使用 Maven settings.xml
文件来存储数据库用户和密码:
<settings>
<servers>
<server>
<!-- By default Flyway will look for the server with the id 'flyway-db' -->
<!-- This can be customized by configuring the 'serverId' property -->
<id>flyway-db</id>
<username>myUser</username>
<password>mySecretPwd</password>
</server>
</servers>
</settings>
【讨论】:
感谢您的建议,因为上一个答案对我有帮助,我没有尝试这些,但它仍然是一个不错的选择!以上是关于将外部文件中的值加载到 pom.xml的主要内容,如果未能解决你的问题,请参考以下文章
如何将变量从外部 JavaScript 传递到 HTML 表单
将 HTML 文件中的外部 javascript 文件从 android assets 文件夹加载到 WebView