将外部文件中的值加载到 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 将搜索并自动加载 &lt;user-home&gt;/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

将外部文件加载到jquery mobile中的页面ID中

将文件从外部存储加载到 Inputstream

将社交媒体的外部 Javascript 加载到网页中的目的 [关闭]

将 INI 文件中的值加载到组合框