无法将动态属性添加到位于构建路径的Maven资源

时间:2016-04-21 11:12:39

标签: maven maven-3 war maven-archetype

我尝试使用config.ini中的src/main/config设置pom.xml中的属性,如this answer中所述,但不是src/main/config工作

我已经放置到config.ini文件runtime_mode=${runtime.mode},其中存在以下行:runtime_mode当我尝试在运行时${runtime.mode}键访问时,我得到了字符串{ {1}}代替pom.xml中定义的 DEBUG PRODUCTION 。当我在${runtime.mode}文件中使用*.html时,它会被预期的适当值替换。

因此,仅当资源位于构建路径时,它才起作用。

我怀疑我是以错误的方式定义资源,但却无法意识到错误。

这是我pom.xml的构建部分:

<project>
    <properties>
        <runtime.mode>DEBUG</runtime.mode>
    </properties>

    <build>
        <finalName>${project.name}</finalName>
        <resources>
          <resource>
            <directory>src/main/config</directory>
            <filtering>true</filtering>
         </resource>
        </resources>

        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <webResources>
                        <resource>
                          <!-- this is relative to the pom.xml directory -->
                          <directory>src/main/webapp</directory>
                          <filtering>true</filtering>
                          <includes>
                              <include>bower.json</include>
                              <include>index.html</include>
                          </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

我的应用是使用以下原型创建的war项目:

<archetype>
      <groupId>com.ibm.tools.archetype</groupId>
      <artifactId>webapp-jee7-liberty</artifactId>
      <version>1.0</version>
      <description>JEE7 web application targeting WebSphere Liberty archetype</description>
</archetype>

更新: 已将我的config.ini移至src\main\resources并更改了我的<resource>代码,如下所示:

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>config.ini</include>
            </includes>
        </resource>
    </resources>

但是现在我无法从代码中读取src/main/resources中的任何资源,例如我将sql.xml放在我所有的SQL查询中。

通过以下代码尝试阅读:

private static Properties readProperties(String xmlFileName) throws Exception {
         Properties properties = new Properties();
         InputStream is = SQLProvider.class.getClassLoader().getResourceAsStream(xmlFileName);
         properties.loadFromXML(is);
         return properties;
    }

但它引发了一个错误:

java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203) ~[?:1.8.0_45]
    at java.util.Properties.loadFromXML(Properties.java:881) ~[?:1.8.0_45]
    at ***.SQLProvider.readProperties(SQLProvider.java:26) ~[classes/:?]

1 个答案:

答案 0 :(得分:0)

尝试使用maven-replacer-plugin您可以替换外部文件中定义的任何令牌。

示例

      <properties>
         <runtime.mode>DEBUG</runtime.mode>
      </properties>

     <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>maven-replacer-plugin</artifactId>
            <version>1.4.0</version>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <ignoreMissingFile>false</ignoreMissingFile>
                <file>path to file/config.ini</file>
                <regex>false</regex>
                <replacements>
                    <replacement>
                        <token>$runtime.mode$</token>
                        <value>${runtime.mode}</value>
                    </replacement>
                </replacements>
            </configuration>
        </plugin>