我们使用ant构建(一个巨大的)项目,并且(由于遗留原因)我们在属性文件中嵌套了很多属性。
(例如在build.xml中)
<ant dir="${object.build.dir}" target="deploy" />
(在一些属性文件中:)
object.build.dir=${base.dir}
(在其他一些属性文件中(有时甚至相同)):
base.dir=${env}/some/dir
然后,因为蚂蚁不再是最近的了,我们现在正在转向maven,这将是一场噩梦......
问题是:你如何读取属性内部属性的结果,有时甚至可以达到5级......
(作为测试)
过滤器/ top_level.properties:
env=test
过滤器/测试/ mid_level.properties:
specific=spec
filters / top_level.properties也可以读取(对于另一个环境):
env=prod
以及filter / prod / mid_level.properties:
specific=spock
问题归结为:
如何读取/使用在另一个属性文件中为其定义路径的属性文件中定义的“特定”属性?) (还有这种各样的筑巢?)
此外,这不涉及'资源'(这些也涉及但不是主要问题,资源是应用程序使用的属性,我所讨论的属性是仅在构建时使用的属性如何构建发生)
我找到了答案,但如果有更好的答案,我很乐意选择最佳答案...
S上。
答案 0 :(得分:0)
在maven中你有properties:read-project-properties插件。
如果您使用它,嵌套属性将不会插入到下层属性中: (maven仍会抱怨它没有找到“filters / $ {env} /mid_level.properties”属性文件
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>execution1</id>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>filters/top_level.properties</file>
<file>filters/${env}/mid_level.properties</file>
</files>
</configuration>
</execution>
</plugin>
</plugins>
</build>
但是如果你把这样的执行分开(+回应'具体'的值:)
<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>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<description>test</description>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>execution1</id>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>filters/top_level.properties</file>
</files>
</configuration>
</execution>
<execution>
<id>execution2</id>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>filters/${env}/mid_level.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.soebes.maven.plugins</groupId>
<artifactId>maven-echo-plugin</artifactId>
<version>0.1</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>echo</goal>
</goals>
</execution>
</executions>
<configuration>
<echos>
<echo>Animal: ${specific}</echo>
</echos>
</configuration>
</plugin>
</plugins>
</build>
</project>
输出env = prod:
[INFO] --- maven-echo-plugin:0.1:echo (default) @ test ---
[INFO] Animal: spock
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.663 s
[INFO] Finished at: 2017-04-13T21:32:30+02:00
[INFO] Final Memory: 11M/164M
[INFO] ------------------------------------------------------------------------
问题解决了:))
你只需要拥有与嵌套深度一样多的属性执行+重构属性以使它们处于分层状态,但是从这个问题中可以“轻松”解决......